基于Linux的标准PING程序C实现.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于Linux的标准PING程序C实现 曹玮(3004204123) 04级计算机5班 实验目的: 了解套接字(socket)实现原理,阅读Linux或者FreeBSD网络部分的源程序。 在某一种平台(Linux,Unix系列或Windows系列)下进行网络客户机-服务器编程。 程序要求: 编写一个基于UDP的ping程序,使其产生4个报文,发送这些报文并对应答计时,通过这种方法来测量它们之间的RTT,用来测试目的主机的可达性。 程序简介 本程序是基于标准的ping服务写成的,用到了IP 协议和ICMP协议。程序可以用于网际测试RTT的应用中。 如同上一个程序,myping程序也是一个Linux下的命令行模式的程序。其以某个目的主机的IP地址或是主机名为命令行参数,通过解析,得到有用信息,再由程序创建原始套接字(为了应用于标准服务),然后发送包含ICMP包头的信息,信息中有发送时的时间。接收时,去掉IP包头,获得ICMP包头中的时间信息,与当前时间作差,既为RTT。连续发送4个包,另一线程随即接受,如成功接收完成,或当接收到SIGINT信号,或时间超过10秒后(由SIGALRM信号控制),程序结束并显示接受状态。 上述过程,基本是参照Linux中标准ping程序的模式完成的,事实上,再完成该代码的过程中,我也参考了Debian Linux中的相关原代码。 由于在这个程序上画的精力不是太大,好些功能还不完善。比如一次发包数不能通过命令行参数加以修改;没有图形界面等等,这些问题会在今后的版本中加以改进。 程序原理及主要技术: 由于本程序实现的是一个标准的Ping服务(即可以通过IP或主机名ping到任何互联网上提供ping服务的主机上),因此它实现了好多标准的协议,需要很多相关技术的支持。因为好多实现过程在大多数的教程中都有讲述,这里就不做一一叙述了,仅简要介绍一下流程。 首先是IP地址或主机名的解析,将有用信息(IP地址)负值到目的地址的结构体(struct sockaddr_in)当中,然后生成原始套接字,用于收发数据包。 收发过程我设计了两个线程:主线程用来发送数据包,时间间隔为1秒;另外的线程负责接收被原样返回的包。一旦接受到SIGINT信号,或接收时间超过10秒,则程序退出并显示结果。 发送过程主要是给数据包加ICMP包头(8字节)的过程。在Linux 中有一个 netinet/ip_icmp.h的头文件,其中记录了icmp包头的数据结构struct icmp,因此可以直接使用。对icmp相关位进行负值。记录发送时间(用timeval结构表示),记录报的序列号,记录报的标示(用程序的PID唯一表示)。 值得一提的是,icmp包头中有一个校验和,它的计算方法是:把校验的数据按两字节累加;结果超出16bit的部分,再右移16位与原结果低16位继续累加,直至不再有高出16位的数字。这就是网际校验算法。对于它的实现还有一些细节问题,我参考了Linux 的源代码。 然后进行发送,由于是UDP,所以不需要绑定和accept(),直接用sendto()函数进行发送即可。 接收过程也是一样,用recvfrom()接收,先去掉4字节的IP包头,再在ICMP包头中获取序列号,标示(如果与进程PID不一致,则表明不是改进成发送的包,不作处理),以及发送时间。通过与当前时间比对计算出RTT。 流程图: 主要函数及功能: 请参看程序源代码,里面有每个函数功能的详细描述。 其他说明: [1]. 本程序在Linux Redhat 9 下编译运行成功。程序的二进制代码附在压缩包中,但由于Linux各个发行版之间可能存在兼容性问题,且生成原始套接字时需要root权限,并且需要给程序加SUID权,才能使非root用户使用。因此强烈建议在测试时,安装压缩包中提供的tar 包! 具体方法:先用tar –jxvf ping.tar 命令解压;在用su命令变为root用户, 执行编译命令:make 执行安装命令:make install (注意:以上两步均需要有root权限,否则无法正确运行程序!) [2]. 执行安装后,程序二进制代码将复制在你的/usr/local/bin目录下,直接在命令行里输入myping 加IP地址或主机名就能运行程序了。 [3]. 如在安装测试中遇到任何问题, HYPERLINK mailto:请致信amalcaowei@ 请致信amalcaowei@。

文档评论(0)

zhuliyan1314 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档