欢迎来到天天文库
浏览记录
ID:20732472
大小:80.69 KB
页数:5页
时间:2018-10-15
《简单的ping6程序的实现内有代码》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、Ping6程序的实现Ping6函数主要用于14一个节点发送M送请求报文外接收该节点M复的1"1送成答报文用于确定一个节点的可达性及往返时间延迟。回送请求报文格式如下:071531类型=128代码=0校验和=ICMP校验和te识符序列号数裾图4-6回送请求报文格式标识符和序列号巾源节点产生,川于将请求报文和放答报文对疢起來,其屮数据可以足任意字节的任意数裾。回送应答报文格式如下:071531类型=129代码=0校验和=ICMP校验和标识符序列号数裾图4-7回送应答报文格式冋送应答报文的标识符和序列号及数据都足由诮求报文屮获得。在
2、linux下ICMPv6的报义尖结构如下:木程序中,报文简化为只包含消息类型、消息代码、数裾报的ID、数据报的序列兮及数据段儿个部分。ICMPV6M送请求报文类型为128;ICMPV6回送请求报文代码值为0;ICMPV6回送请求报义序列号通常为一个递增的数生成ICMPV6回送请求报文的ID川于对应回送应答报文,通常川进程的PID补充同吋保存发送吋间。inticmpv6_pack(intpack_num){inti,packsize;structicmp6_hdr*icmpv6;structtimeval*tval;//消息类型
3、为ICMPv6冋请求//code为0//校验和初始值为0//序列号icmpv6=(structicmp6_hdr*)sendbuf;icmpv6->icmp6_type=128;icmpv6->icmp6_code=0;icmpv6->icmp6_cksum=0;icmpv6->icmp6_seq=pack_num;//进程pidicmpv6->icmp6_id=pid;packsize=8+datalen;gettimeofday(sendtime,NULL);//获取发送数据时间returnpacksize;}发送报文:将
4、打包好的数据通过原始套接字发送到指定地址,使川sendto函数。每次发送成功后序列号增加1,即nsend++voidicmp6_send(){intpacketsize;if(nsend5、entoerror");}}}接受报文:接受报文在接收数据乜的值小于发送数据乜的值吋,继续接收数据乜,通过recvfrom函数将接收到的数据存储到recvbuf中,将发送数据端的IP地址存储在recv_addr屮,记录接收数裾包的时间,调用u叩ack函数对数裾包进行解包和数裾分析。接收到一个报文后接收序列号外没有加1,而足在解包后确定数据包正确后加1,防止接收错误的报文导致丢也的情况。voidicmp6_recv(){intnjromlen;fromlen=sizeof(recv_addr);while(nrecv6、)//接收报文少于发送报文,继续接收{if((n=recv什om(socksaw,recvbuf,sizeof(recvbuf),0,(structsockaddr*)&recv_addr,&fromlen))<0)//接收报文{perror("recvfromerror");}gettimeofday(&recvtime,NULL);//保存接收数据IsL时间unpack(recvbuf,n);//解压数据包,并数据处理}}解压收到的报文:接收到报文后判断报文长度是不是太短,如果不是证明报文有效,需要判断报文的类型是否为回送7、应答报文即类型号是不是129,并核实其标识ID是否是本进程PID,确定报文正确后,接收序列号加1.通过接收报文的吋间减去发送报文的吋间,可以得到报文往返时间。敁沿是对返回信息进行显示,因为ipv6为128个字节,中间为0的位一般用::代替,为了显示美观,采用了标志位flag进行判断,达到显示标准ipv6地址格式的H的。intunpack(char*buf,intlen){inti;intiphdrlen;structip6*ip6;structicmp6_hdr*icmpv6;doublertt;intflag=O;icmpv8、6=(structicmp6_hdr*)(buf);//获得ICMPv6报文地址if(len<8){printf("ICMPpacker'slengthislessthan8");return(-l);}/*检查消息类型和进程号是否匹配Vif((icmpv6->icmp
5、entoerror");}}}接受报文:接受报文在接收数据乜的值小于发送数据乜的值吋,继续接收数据乜,通过recvfrom函数将接收到的数据存储到recvbuf中,将发送数据端的IP地址存储在recv_addr屮,记录接收数裾包的时间,调用u叩ack函数对数裾包进行解包和数裾分析。接收到一个报文后接收序列号外没有加1,而足在解包后确定数据包正确后加1,防止接收错误的报文导致丢也的情况。voidicmp6_recv(){intnjromlen;fromlen=sizeof(recv_addr);while(nrecv6、)//接收报文少于发送报文,继续接收{if((n=recv什om(socksaw,recvbuf,sizeof(recvbuf),0,(structsockaddr*)&recv_addr,&fromlen))<0)//接收报文{perror("recvfromerror");}gettimeofday(&recvtime,NULL);//保存接收数据IsL时间unpack(recvbuf,n);//解压数据包,并数据处理}}解压收到的报文:接收到报文后判断报文长度是不是太短,如果不是证明报文有效,需要判断报文的类型是否为回送7、应答报文即类型号是不是129,并核实其标识ID是否是本进程PID,确定报文正确后,接收序列号加1.通过接收报文的吋间减去发送报文的吋间,可以得到报文往返时间。敁沿是对返回信息进行显示,因为ipv6为128个字节,中间为0的位一般用::代替,为了显示美观,采用了标志位flag进行判断,达到显示标准ipv6地址格式的H的。intunpack(char*buf,intlen){inti;intiphdrlen;structip6*ip6;structicmp6_hdr*icmpv6;doublertt;intflag=O;icmpv8、6=(structicmp6_hdr*)(buf);//获得ICMPv6报文地址if(len<8){printf("ICMPpacker'slengthislessthan8");return(-l);}/*检查消息类型和进程号是否匹配Vif((icmpv6->icmp
6、)//接收报文少于发送报文,继续接收{if((n=recv什om(socksaw,recvbuf,sizeof(recvbuf),0,(structsockaddr*)&recv_addr,&fromlen))<0)//接收报文{perror("recvfromerror");}gettimeofday(&recvtime,NULL);//保存接收数据IsL时间unpack(recvbuf,n);//解压数据包,并数据处理}}解压收到的报文:接收到报文后判断报文长度是不是太短,如果不是证明报文有效,需要判断报文的类型是否为回送
7、应答报文即类型号是不是129,并核实其标识ID是否是本进程PID,确定报文正确后,接收序列号加1.通过接收报文的吋间减去发送报文的吋间,可以得到报文往返时间。敁沿是对返回信息进行显示,因为ipv6为128个字节,中间为0的位一般用::代替,为了显示美观,采用了标志位flag进行判断,达到显示标准ipv6地址格式的H的。intunpack(char*buf,intlen){inti;intiphdrlen;structip6*ip6;structicmp6_hdr*icmpv6;doublertt;intflag=O;icmpv
8、6=(structicmp6_hdr*)(buf);//获得ICMPv6报文地址if(len<8){printf("ICMPpacker'slengthislessthan8");return(-l);}/*检查消息类型和进程号是否匹配Vif((icmpv6->icmp
此文档下载收益归作者所有