首页 运维 网络学院 查看内容

ping 命令工作原理详细解析

2005-11-14 00:11 723 1

摘要: ping的原理就是首先建立通道,然后发送包,对方接受后返回信息,这个包至少包括以下内容,发送的时候,包的内容包括对方的ip地址和自己的地址,还有序列数,回送的时候包括双方地址,还有时间等,主要是接受方...
关键词: ICMP include 字节 unsigned int struct 报头 short sum timeval

ping的原理就是首先建立通道,然后发送包,对方接受后返回信息,这个包至少包括以下内容,发送的时候,包的内容包括对方的ip地址和自己的地址,还有序列数,回送的时候包括双方地址,还有时间等,主要是接受方在都是在操作系统内核里做好的,时刻在监听,提供一段c程序的代码,希望对大家有用。   #include   #include   #include   #include   #include   #include   #include   #include   #include   #include   #include   #include   #define PACKET_SIZE 4096   #define MAX_WAIT_TIME 5   #define MAX_NO_PACKETS 3   char sendpacket[PACKET_SIZE];   char recvpacket[PACKET_SIZE];   int sockfd,datalen=56;   int nsend=0,nreceived=0;   struct sockaddr_in dest_addr;   pid_t pid;   struct sockaddr_in from;   struct timeval tvrecv;   void statistics(int signo);   unsigned short cal_chksum(unsigned short *addr,int len);   int pack(int pack_no);   void send_packet(void);   void recv_packet(void);   int unpack(char *buf,int len);   void tv_sub(struct timeval *out,struct timeval *in);   void statistics(int signo)   { printf("\n--------------------PING statistics-------------------\n");   printf("%d packets transmitted, %d received , %%%d lost\n",nsend,nreceived,   (nsend-nreceived)/nsend*100);   close(sockfd);   exit(1);   }   /*校验和算法*/   unsigned short cal_chksum(unsigned short *addr,int len)   { int nleft=len;   int sum=0;   unsigned short *w=addr;   unsigned short answer=0;   /*把ICMP报头二进制数据以2字节为单位累加起来*/   while(nleft>1)   { sum+=*w++;   nleft-=2;   }   /*若ICMP报头为奇数个字节,会剩下最后一字节。把最后一个字节视为一个2字节数据的高字节,这个2字节数据的低字节为0,继续累加*/   if( nleft==1)   { *(unsigned char *)(&answer)=*(unsigned char *)w;   sum+=answer;   }   sum=(sum>>16)+(sum&0xffff);   sum+=(sum>>16);   answer=~sum;   return answer;   }   /*设置ICMP报头*/   int pack(int pack_no)   { int i,packsize;   struct icmp *icmp;   struct timeval *tval;   icmp=(struct icmp*)sendpacket;   icmp->icmp_type=ICMP_ECHO;   icmp->icmp_code=0;   icmp->icmp_cksum=0;   icmp->icmp_seq=pack_no;   icmp->icmp_id=pid;   packsize=8+datalen;   tval= (struct timeval *)icmp->icmp_data;   gettimeofday(tval,NULL); /*记录发送时间*/   icmp->icmp_cksum=cal_chksum( (unsigned short *)icmp,packsize); /*校验算法*/   return packsize;   }
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

返回顶部