您现在的位置: 新风网管之家 >> 网管培训 >> 网络基础 >> 教程正文

ping 命令工作原理详细解析

作者:※文风※    教程来源:新风网管之家    点击数:    更新时间:2006-1-2 【字体:
教程录入:admin    责任编辑:admin 
发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口

>> 相关资讯:

  • 上一篇教程:
  •  
  • 下一篇教程:
  • 最新五条评论
    您的评论
    姓 名: 评 分: 1分 2分 3分 4分 5分
    ·本站发布内容均为客观表达作者观点,不代表新风网管之家立场,请勿攻击和漫骂
    ·用户发表意见仅代表其个人意见,并且承担一切因发表内容引起的纠纷和责任
    ·本站管理人员有权在不通知用户的情况下删除不符合规定的评论信息或留做证据
    ·请客观的评价您所看到的资讯,提倡就事论事,杜绝漫骂和人身攻击等不文明行为
    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;

      }