网络软件 系统工具 应用软件 图形图像 多媒体类 免费游戏 安全相关 免费音乐 网页素材 电子书籍 考试考题 建站源码
教育教学 多媒体类 编程开发 操作系统 游戏天地 娱乐天地 简历求职 站长专区 网页设计 安全技术 图形图像 文学驿站
业界资讯 | 图形图像 | 操作系统 | 网络冲浪 | 工具软件 | 办公软件 | 媒体动画 | 精文荟萃 | 认证考试 | 网页设计 | 技术开发 | 专栏
当前位置:热点网络学院简历求职认证培训ping 命令工作原理详细解析
精品推荐
热点TOP10
·Oracle的初学者入门心得
·全国计算机等级二级FOX上机编程题题型
·计算机网络中级考核大纲
·网络工程师考试大纲(2004年新版)
·一位年轻的系统分析员的历程
·市场细分“方式”先行 外语培训市场日趋务实
·备战C语言上机考试
·Solaris认证 飞入“寻常百姓家”
·合格的网页设计师应该具有的素质
·Red Hat Linux认证RHCE课程介绍
·信息系统监理工程师应试心得
·2005年高级会计师资格考试9月4日开考
·系统分析师级考试大纲(2004年新版)
·七种计算机认证考试 你选哪个
·信息技术考核模拟试题 题库(一)
·NIT之Intel认证培训课程简介
·浅析蓝牙技术的基带层分组协议
·电脑应用习题3 硬件篇
·Cisco路由器故障诊断技术及相关口令
·初级程序员级考试大纲
ping 命令工作原理详细解析
日期:2005年11月14日 作者: 查看:[大字体 中字体 小字体]
  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;
  }


(出处:http://down.xmsc.com.cn/)

关于我们 | 帮助(?) | 版权声明 | 友情连接 
Copyright 2005-2005 xmsc.com.cn All Rights Reserved.
Powered by:mesky