C++验证IP是否可PING与巨型帧设置(一零三)
Posted 马少爷
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++验证IP是否可PING与巨型帧设置(一零三)相关的知识,希望对你有一定的参考价值。
1、C++验证IP是否可以PING通
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与巨型帧设置(一零三)的主要内容,如果未能解决你的问题,请参考以下文章