Linux网络编程之原始套接字ping协议实现重点.docVIP

Linux网络编程之原始套接字ping协议实现重点.doc

  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文档。上传文档
查看更多
1.概述 PING协议是用来检验本地主机与远程主机是否连接,发送的是ICMP ECHO_REQUEST包。普通的套接字是基于TCP或者是UDP的,无法发送ICMP包,所以必须用原始套接字来实现。PING协议的客户端类型值为8,代码值为0,表示请求。而PING协议的响应端类型值为0,代码值也为0,表示应答. 以太网数据部分的最小值为46字节,而IP首部占20个字节,ICMP的首部占8个字节,所以PING的数据部分至少为4字节。 2.实现细节 主机端: (1)创建原始套接字 socket(AF_INET,SOCK_RAW,htons(proto)),能够直接得到IP包 (2)填写ICMP首部和数据部分,即icmp_type(8),icmp_code(0)和icmp_data部分 (3)封装后发送ICMP请求包 响应端: (1)创建原始套接字socket(AF_INET,SOCK_RAW,htons(proto)) (2)填写ICMP首部和数据部分,即icmp_type(0),icmp_code(0),icmp_data (3)发送ICMP响应包 主机端收到ICMP响应包之后,即原始的IP包,将收到包的时间减去包的发送时间就可以得到响应时延。 3. PING协??的实现例子 #include sys/socket.h #include netinet/in.h #include netinet/ip.h #include netinet/ip_icmp.h #include unistd.h #include signal.h #include arpa/inet.h #include errno.h #include sys/time.h #include string.h #include netdb.h #include pthread.h #include stdlib.h #include stdio.h /** 通过原始套接字发送ICMP回显请求报文来实现ping协议 ICMP回显报文的结构 struct icmp{ ? u_int8_t icmp_type;//消息类型 ? u_int8_t icmp_code;//消息类型的子码 ? u_int16_t icmp_cksum;//校验和 ? union{ ?? struct ih_idseq{//显示数据报 ???? u_int16_t icd_id;//数据报所在进程的ID ???? u_int16_6 icd_seq;//数据报序号 }ih_idseq; }icmp_hun; #define icmp_id icmp_hun.ih_idseq.icd_id #define icmp_seq icmp_hun.ih_idseq.icd_seq union{ ?u_int8_t id_data[i];//数据 ? }icmp_dun; #define icmp_data icmp_dun.id_data } **/ typedef struct pingm_packet{ ??? struct timeval tv_begin;//发送的时间 ??? struct timeval tv_end;//接收到响应包的时间 ??? short seq;//序号值 ??? int flag;//1表示已经发送但没有接收到回应包,0表示接收到响应包 }pingm_packet; //保存已经发送包的状态值 static pingm_packet pingpacket[128];//定义一个包数组 static pingm_packet *icmp_findpacket(int seq); static unsigned short icmp_cksum(unsigned char*data,int len); static struct timeval icmp_tvsub(struct timeval end,struct timeval begin); static void icmp_statistics(void); static void icmp_pack(struct icmp*icmph,int seq,struct timeval *tv,int length); static int icmp_unpack(char*buf,int len); static void* icmp_recv(void*argv); static void* icmp_send(void*argv); static void icmp_sigint(int signo); static void icmp_usage(); #define K 1024 #defi

文档评论(0)

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

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

1亿VIP精品文档

相关文档