欢迎来到天天文库
浏览记录
ID:14206889
大小:46.50 KB
页数:17页
时间:2018-07-26
《用c语言实现ping程序功能》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、用C语言实现Ping程序功能(zt)用C语言实现Ping程序功能作者:zhchhui发表时间:2003-07-0320:05:41大部分人用ping命令只是作为查看另一个系统的网络连接是否正常的一种简单方法。在这篇文章中,作者将介绍如何用C语言编写一个模拟ping命令功能的程序。ping命令是用来查看网络上另一个主机系统的网络连接是否正常的一个工具。ping命令的工作原理是:向网络上的另一个主机系统发送ICMP报文,如果指定系统得到了报文,它将把报文一模一样地传回给发送者,这有点象潜水艇声纳系统中使用的发声装置。例
2、如,在Linux终端上执行ping localhost命令将会看到以下结果:PINGlocalhost.localdomain(127.0.0.1)from127.0.0.1:56(84)bytesofdata.64bytesfromlocalhost.localdomain(127.0.0.1):icmp_seq=0ttl=255time=112usec64bytesfromlocalhost.localdomain(127.0.0.1):icmp_seq=1ttl=255time=79usec64bytesfr
3、omlocalhost.localdomain(127.0.0.1):icmp_seq=2ttl=255time=78usec64bytesfromlocalhost.localdomain(127.0.0.1):icmp_seq=3ttl=255time=82usec---localhost.localdomainpingstatistics---4packetstransmitted,4packetsreceived,0%packetlossround-tripmin/avg/max/mdev=0.078/0.
4、087/0.112/0.018ms由上面的执行结果可以看到,ping命令执行后显示出被测试系统主机名和相应IP地址、返回给当前主机的ICMP报文顺序号、ttl生存时间和往返时间rtt(单位是毫秒,即千分之一秒)。要写一个模拟ping命令,这些信息有启示作用。要真正了解ping命令实现原理,就要了解ping命令所使用到的TCP/IP协议。ICMP(InternetControlMessage,网际控制报文协议)是为网关和目标主机而提供的一种差错控制机制,使它们在遇到差错时能把错误报告给报文源发方。ICMP协议是IP层
5、的一个协议,但是由于差错报告在发送给报文源发方时可能也要经过若干子网,因此牵涉到路由选择等问题,所以ICMP报文需通过IP协议来发送。ICMP数据报的数据发送前需要两级封装:首先添加ICMP报头形成ICMP报文,再添加IP报头形成IP数据报。如下图所示IP报头ICMP报头ICMP数据报IP报头格式由于IP层协议是一种点对点的协议,而非端对端的协议,它提供无连接的数据报服务,没有端口的概念,因此很少使用bind()和connect()函数,若有使用也只是用于设置IP地址。发送数据使用sendto()函数,接收数据使用
6、recvfrom()函数。IP报头格式如下图:在Linux中,IP报头格式数据结构(定义如下:structip{#if__BYTE_ORDER==__LITTLE_ENDIANunsignedintip_hl:4;/*headerlength*/unsignedintip_v:4;/*version*/#endif#if__BYTE_ORDER==__BIG_ENDIANunsignedintip_v:4;/*version*/unsignedintip_hl:4;/*headerlen
7、gth*/#endifu_int8_tip_tos;/*typeofservice*/u_shortip_len;/*totallength*/u_shortip_id;/*identification*/u_shortip_off;/*fragmentoffsetfield*/#defineIP_RF0x8000/*reservedfragmentflag*/#defineIP_DF0x4000/*dontfragmentflag*/#defineIP_MF0x2000/*morefragmentsflag*/#
8、defineIP_OFFMASK0x1fff/*maskforfragmentingbits*/u_int8_tip_ttl;/*timetolive*/u_int8_tip_p;/*protocol*/u_shortip_sum;/*checksum*/structin_addrip_src,ip_dst;/*sourceanddestaddress*/}
此文档下载收益归作者所有