ping 命令工作原理详细解析

社区服务
高级搜索
猴岛论坛电脑百科ping 命令工作原理详细解析
发帖 回复
倒序阅读 最近浏览的帖子最近浏览的版块
0个回复

ping 命令工作原理详细解析

楼层直达
冷尘

ZxID:2312963

等级: 上将
花非花。雾非雾。夜半来。天明去。
举报 只看楼主 使用道具 楼主   发表于: 2009-04-01 0
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;

  }

  待  浮  花  浪  蕊  俱  尽, 伴  君  幽  独
« 返回列表
发帖 回复