简单的ping6程序的实现内有代码_第1页
简单的ping6程序的实现内有代码_第2页
简单的ping6程序的实现内有代码_第3页
简单的ping6程序的实现内有代码_第4页
简单的ping6程序的实现内有代码_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Ping6程序的实现Ping6函数主要用于向一个节点发送回送请求报文并接收该节点回复的回送应答报文用于确定一个节点的可达性及往返时间延迟。回送请求报文格式如下:标识符和序列号由源节点产生,用于将请求报文和应答报文对应起来,其中数据可以是任意字节的任意数据。回送应答报文格式如下:回送应答报文的标识符和序列号及数据都是由请求报文中获得。在linux下ICMPv6的报文头结构如下:本程序中,报文简化为只包含消息类型、消息代码、数据报的ID、数据报的序列号及数据段几个部分。ICMPV6回送请求报文类型为128;ICMPV6回送请求报文代码值为0;ICMPV6回送请求报文序列号通常为一个递增的数生成IC

2、MPV6回送请求报文的ID用于对应回送应答报文,通常用进程的PID补充同时保存发送时间。int icmpv6_pack(int pack_num) int i,packsize;struct icmp6_hdr *icmpv6;struct timeval *tval;icmpv6=(struct icmp6_hdr*)sendbuf;icmpv6->icmp6_type=128; /消息类型为ICMPv6回显请求icmpv6->icmp6_code=0; /code为0icmpv6->icmp6_cksum=0; /校验和初始值为0icmpv6->icmp6_seq=

3、pack_num; /序列号icmpv6->icmp6_id=pid; /进程pidpacksize=8+datalen;gettimeofday(sendtime,NULL); /获取发送数据时间return packsize;发送报文:将打包好的数据通过原始套接字发送到指定地址,使用sendto函数。每次发送成功后序列号增加1,即nsend+void icmp6_send()int packetsize;if(nsend < max_loop_num)nsend+; /发送序列号加1packetsize =icmpv6_pack(nsend); /打包数据if(sendto(s

4、ocksaw,sendbuf,packetsize,0,(struct sockaddr *)&send_addr,sizeof(send_addr)<0) /发送数据包perror("sento error"); 接受报文:接受报文在接收数据包的值小于发送数据包的值时,继续接收数据包,通过recvfrom函数将接收到的数据存储到recvbuf中,将发送数据端的IP地址存储在recv_addr中,记录接收数据包的时间,调用unpack函数对数据包进行解包和数据分析。接收到一个报文后接收序列号并没有加1,而是在解包后确定数据包正确后加1,防止接收错误的报文导致丢

5、包的情况。void icmp6_recv() int n,fromlen;fromlen =sizeof(recv_addr);while(nrecv <nsend) /接收报文少于发送报文,继续接收 if(n = recvfrom(socksaw,recvbuf,sizeof(recvbuf),0, (struct sockaddr *)&recv_addr,&fromlen)<0) /接收报文 perror("recvfrom error"); gettimeofday(&recvtime,NULL); /保存接收数据包时间 unpa

6、ck(recvbuf,n); /解压数据包,并数据处理解压收到的报文:接收到报文后判断报文长度是不是太短,如果不是证明报文有效,需要判断报文的类型是否为回送应答报文即类型号是不是129,并核实其标识ID是否是本进程PID,确定报文正确后,接收序列号加1.通过接收报文的时间减去发送报文的时间,可以得到报文往返时间。最后是对返回信息进行显示,因为ipv6为128个字节,中间为0的位一般用:代替,为了显示美观,采用了标志位flag进行判断,达到显示标准ipv6地址格式的目的。int unpack(char *buf,int len) int i; int iphdrlen; struct ip6 *

7、ip6; struct icmp6_hdr *icmpv6; double rtt; int flag=0; icmpv6 = (struct icmp6_hdr *)(buf); /获得ICMPv6报文地址 if(len<8) printf("ICMP packer's length is less than 8n"); return(-1); /*检查消息类型和进程号是否匹配*/ if(icmpv6->icmp6_type =129)&&(icmpv6->icmp6_id = pid) nrecv+; /判断数据有效,接收序列号

8、加1 different.tv_sec = recvtime.tv_sec - sendtime->tv_sec; different.tv_usec = recvtime.tv_usec - sendtime->tv_usec; /计算时间差 rtt = different.tv_sec*1000.0 + different.tv_usec/1000.0; printf("%d bytes from:",len); for(i=0;i<16;i+) /打印ipv6地址 if(recv_addr.sin6_addr.s6_addri=0&&

9、flag=0) printf(":"); flag=1; else if(recv_addr.sin6_addr.s6_addri=0&&flag=1) flag=flag; else if(recv_addr.sin6_addr.s6_addri!=0&&flag=1) printf("%02x",recv_addr.sin6_addr.s6_addri); flag=2; elseprintf("%02x",recv_addr.sin6_addr.s6_addri); printf(" i

10、cmp_seq=%u time=%1.4f msn",icmpv6->icmp6_seq,rtt); 主函数:主函数主要包括以下几个部分:(1) 对参数个数进行判断,判断参数是否有效。(2) 通过套接字选项设置发送和接收超时选项。(3) 进行地址处理,首先通过inet_pton函数将字符串格式的地址转换为二进制地址,然后拷贝到对应套接字地址结构体,为发送数据准备。(4) 循环发送接收max_loop_num次。void main(int argc,char *argv)switch(argc) /判断参数个数, case 3:max_loop_num = atoi(argv2)

11、;case 2:printf(" receice 1 parameter:n");printf("param 1:%sn",argv1);printf("n");tv.tv_sec=5;tv.tv_usec =0;break;default:printf("please input correct paramn");exit(0);break; socksaw = socket(PF_INET6,SOCK_RAW,IPPROTO_ICMPV6); /建立套接字 setsockopt(socksaw, SOL_SOC

12、KET, SO_RCVTIMEO, &tv, sizeof(struct timeval);/接收超时 setsockopt(socksaw, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(struct timeval);/发送超时 send_addr.sin6_family =AF_INET6; addrptr=inet_pton(AF_INET6,argv1,&addr); /地址转换 if(addrptr>0) printf("inet_pton:ip,%sn",argv1); elseprintf("err addr:%dn",addrptr); memcpy(&send_addr.sin6_addr,&addr,sizeof(addr); /获取地址 pid = getpid(); /进程PID while(nsend<max_loop_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论