C++验证IP是否可PING与巨型帧设置(一零三)

Posted 马少爷

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++验证IP是否可PING与巨型帧设置(一零三)相关的知识,希望对你有一定的参考价值。


1、C++验证IP是否可以PING通

#include <Winsock2.h>#include "iphlpapi.h" 
#pragma comment(lib,"Iphlpapi.lib")#pragma comment(lib,"Ws2_32.lib")
typedef HANDLE (WINAPI* ICMPCREATEFILE)(VOID); typedef BOOL (WINAPI* ICMPCLOSEHANDLE)(HANDLE); typedef DWORD (WINAPI* ICMPSENDECHO)(HANDLE, DWORD, LPVOID, WORD,PIP_OPTION_INFORMATION, LPVOID, DWORD, DWORD); //定义三个指针函数 ICMPCREATEFILE pIcmpCreateFile; ICMPCLOSEHANDLE pIcmpCloseHandle; ICMPSENDECHO pIcmpSendEcho;
// 函数功能:初始化ICMP函数:BOOL InitIcmp() { HINSTANCE hIcmp = LoadLibrary("ICMP.DLL"); if(hIcmp==NULL)
  { return false;
  } pIcmpCreateFile = (ICMPCREATEFILE)GetProcAddress(hIcmp,"IcmpCreateFile"); pIcmpCloseHandle = (ICMPCLOSEHANDLE)GetProcAddress(hIcmp,"IcmpCloseHandle"); pIcmpSendEcho = (ICMPSENDECHO)GetProcAddress(hIcmp,"IcmpSendEcho"); if ((pIcmpCreateFile == NULL)||(pIcmpCloseHandle == NULL)||(pIcmpSendEcho == NULL)) return false; return true; }

// 函数功能:判断是否能ping通IP// 函数参数:IP地址或域名BOOL ICMPPing(char* host){ DWORD timeOut=1000; //设置超时 ULONG hAddr=inet_addr(host); //如果是IP地址就直接转换 if(hAddr==INADDR_NONE) { hostent* hp=gethostbyname(host); //如果是域名就用DNS解析出IP地址 if(hp) memcpy(&hAddr,hp->h_addr_list,hp->h_length); //IP地址 else { return false; } } HANDLE hIp=pIcmpCreateFile(); IP_OPTION_INFORMATION ipoi; memset(&ipoi,0,sizeof(IP_OPTION_INFORMATION)); ipoi.Ttl =128; //Time-To-Live unsigned char pSend[36]; //发送包 memset(pSend,'E',32); int repSize=sizeof(ICMP_ECHO_REPLY)+32; unsigned char pReply[100]; //接收包 ICMP_ECHO_REPLY* pEchoReply=(ICMP_ECHO_REPLY*)pReply; DWORD nPackets=pIcmpSendEcho(hIp,hAddr,pSend,32,&ipoi,pReply,repSize,timeOut); //发送ICMP数据报文 if(pEchoReply->Status!=0) //超时,可能是主机禁用了ICMP 或者目标主机不存在 { pIcmpCloseHandle(hIp); return false; } pIcmpCloseHandle(hIp); return true; }
int main(){ InitIcmp(); ICMPPing("192.168.0.1"); return 0;}


2、巨型帧

    以太网经过30年的发展,速度已经从最初的10M被提升到了10G,速度提高了1000倍。在这样高速度的传输数据中,如果还是延续经典以太网的最大帧长不超过1518 字节的限制,那么在每秒中传输的数据包的个数将很大。由于每个数据包都需要网络设备来进行处理,由此带来的额外开销也将很大,而且这个开销随着网络速度的提高而愈加明显。
    以Alteon为代表的一些新兴厂商提出了“巨型帧”的概念,大胆地把以太网的最大帧长扩展到了9K,几乎把以前的最大帧长扩展了6倍。加大帧长的好处在于,减少了网络中数据包的个数,减轻了网络设备处理包头的额外开销。经过测试,在传统的千兆以太网中,每秒大约有81,000个数据包流经网络,而在使用了巨型帧的网络中,这个数字减少为14,000。在万兆网络中,这个对比更加强烈,标准的网络中帧长为标准1518的帧每秒有812,000个,而采用了巨型帧技术的网络上仅仅只有14,000个。大量减少的帧数目必将带来性能的提高。这样显著的性能提高,引起了各个厂商的兴趣。

    但是问题并没有这么简单,巨型帧面临的最大问题就是它不是一个国际标准。IEEE自有它自己的考虑,以太网之所以能够成为30年的经典,而且显得越来越有生命力,和以太网的兼容性是有很大的关系。如果采用不同的帧结构,必将带来和以前产品和技术的不兼容,这是IEEE不愿意看到的。而且,IEEE不愿意使标准的制定落入一些新兴厂商的控制之下。

    同时,Internet上的路由器和防火墙设备都是以前设计制造的产品,都不支持巨型帧的传输。企业即使采用了巨型帧技术,也只能在自己支持巨型帧的网络中得到实用,数据包传输到企业网边缘,要向Internet传输时,就要被Internet上的网络设备进行包的分割。
    没有标准,巨型帧就成为一个棘手的问题,如果一个企业要采用配备了巨型帧的产品,就要面临设备兼容的问题,目前的解决方案就是全部采用同一家公司的产品,来避开兼容性的问题。
    万兆以太网,究竟能不能采用巨型帧来提升性能呢,从目前的情况来看,应该是困难重重。企业如果不是要追求目前最大的性能,采用巨型帧会面临一些风险。但是随着万兆技术的发展,这些情况也许会得到一些改善。

    巨型帧是帧长大于1522字节的以太网帧。这是一种厂商标准的超长帧格式,专门为千兆以太网而设计。巨型帧的长度各厂商有所不同,从9000字节~64000字节不等。采用巨型帧能够令千兆以太网性能充分发挥,使数据传输效率提高50%~100%。在网络存储的应用环境中,巨型帧更具有非同寻常的意义。


3、巨型帧的设置

    不同网卡配置界面可能不同,一般在Advanced(高级)选项栏中选择。

打开Jumbo Packet(巨型帧/巨帧数据包)选择9K字节

调整Reveive Buffers(接收缓冲区)到最大,该最大值上限跟网卡性能有关。

C++验证IP是否可PING与巨型帧设置(一零三)

C++验证IP是否可PING与巨型帧设置(一零三)

选择高级

C++验证IP是否可PING与巨型帧设置(一零三)

设置接收缓冲区

C++验证IP是否可PING与巨型帧设置(一零三)

设置巨帧数据包


推荐:














































以上是关于C++验证IP是否可PING与巨型帧设置(一零三)的主要内容,如果未能解决你的问题,请参考以下文章

ping命令有啥作用

Android开发笔记(一百零三)地图与定位SDK

网络相关的命令工具研究报告

powershell 验证GPO IP打印机是否可以ping通

虚拟机ubuntu设置静态IP与主机外网互ping配置流程

绕过CDN查看网站真实IP的一些办法