- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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_sequnion{?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
您可能关注的文档
最近下载
- 大麦EK318.操作手册.C01.220905.pdf
- 五马先生纪年.docx VIP
- 急救与心理技能(视频课)知到课后答案智慧树章节测试答案2025年春中南大学.docx VIP
- 应急救援员国家职业技能标准(2019年版).pdf VIP
- 场地设计作图题-一级建筑师场地设计(作图题)真题精选.docx VIP
- 小学环境教育:校园内水体污染调查与水质保护实践教学研究课题报告.docx
- 阿迪达斯(Adidas)品牌现状分析与二次增长战略规划.pptx
- 人教版七年级上册数学一元一次方程计算题及应用题.docx VIP
- 人教版2025八年级上册英语Unit3 same or different单元复习课件.pptx VIP
- 濒危古树评估与抢救保护技术规程.docx VIP
文档评论(0)