设为首页 加入收藏

TOP

实现类似ping功能的C源代码(二)
2014-02-08 12:43:36 来源: 作者: 【 】 浏览:381
Tags:实现 类似 ping 功能 源代码

 

  fprintf(stdout, "Reply %d bytes Too few\r\n", size);

  }

  else

  {

  XIcmpHeader *icmp_hdr = (XIcmpHeader *)(buf + iphdrlen);

  fprintf(stdout, "%02X%02X%04X\r\n", icmp_hdr->i_type, icmp_hdr->i_code, icmp_hdr->i_cksum);

  fprintf(stdout, "%04X%04X\r\n", icmp_hdr->i_id, icmp_hdr->i_seq);

  fprintf(stdout, "%08X\r\n", icmp_hdr->i_timestamp);

  /*

  fprintf(stdout, "(IcmpData)\r\n");

  int iIcmpDataSize = size - iphdrlen - sizeof(XIcmpHeader);

  char *icmpdata = buf + iIcmpDataSize;

  for (int i = 0; i < iIcmpDataSize; i++)

  fprintf(stdout, "%c", *(icmpdata + i));

  fprintf(stdout, "\r\n");

  */

  unsigned long timestamp = 0;

  #ifdef WIN32

  timestamp = (unsigned long)::GetTickCount();

  #else

  timestamp = (unsigned long)time(NULL);;

  #endif

  timestamp -= icmp_hdr->i_timestamp;

  struct sockaddr_in from;

  from.sin_addr.s_addr = ip_hdr->sourceIP;

  fprintf(stdout, "Reply %d bytes from: %s time<%d TTL=%d icmp_seq=%d\r\n",

  size,

  inet_ntoa(from.sin_addr),

  timestamp,

  ip_hdr->ttl,

  icmp_hdr->i_seq

  );

  }

  }

  }

  int main(int argc, char **argv)

  {

  int ret = 0;

  #ifdef WIN32

  WSADATA ws;

  WSAStartup(0x0101,&ws);

  //#else

  // ;

  #endif

  int iIcmpDataSize = 0;

  struct sockaddr_in dest,from;

  unsigned int addr = 0;

  struct hostent *hp;

  char buffer[1024];

  char recv_buffer[1024];

  if(argc < 2)

  {

  fprintf(stderr, "Usage: %s [host|ip] [datasize]\r\n", argv[0]);

  return 0;

  }

  if (argc > 2)

  iIcmpDataSize = atoi(argv );

  if (iIcmpDataSize < 1 || iIcmpDataSize > 1024)

  iIcmpDataSize = 10;

  memset(&dest, 0, sizeof dest);

  dest.sin_family = AF_INET;

  hp = gethostbyname(argv );

  if (!hp)

  addr = inet_addr(argv );

  if ((!hp) && (addr == INADDR_NONE))

  {

  fprintf(stderr,"Unable to resolve %s\r\n",argv );

  return 0;

  }

  if (hp != NULL)

  memcpy(&(dest.sin_addr), hp->h_addr,hp->h_length);

  else

  dest.sin_addr.s_addr = addr;

  #ifdef WIN32

  // ;

  #else

  setuid(getuid());

  // setuid(0);

  #endif

  int sockfd;

  sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

  fprintf(stdout, "XPing…\r\n");

  for (int i = 0; i < 3; i++)

  {

  fprintf(stdout, "Echo…\r\n");

  memset(buffer, 0, 1024);

  fill_IcmpData(buffer, iIcmpDataSize);

  fill_IcmpHeader(buffer, iIcmpDataSize);

  XIcmpHeader *icmp_hdr = (XIcmpHeader *)buffer;

  int iSendSize = sendto(sockfd, buffer, sizeof(XIcmpHeader) + iIcmpDataSize, 0, (struct sockaddr*)&dest, sizeof(dest));

  fprintf(stdout, "Reply…\r\n");

  memset(&from, 0, sizeof from);

  memset(recv_buffer, 0, 1024);

  #ifdef WIN32

  int fromlen = sizeof(from);

  int iRecvSize = recvfrom(sockfd, recv_buffer, 1024, 0, (struct sockaddr*)&from,   &fromlen);

  #else

  socklen_t fromlen = sizeof(from);

  int iRecvSize = recvfrom(sockfd, recv_buffer, 1024, 0, (struct sockaddr*)&from,   &fromlen);

  #endif

  if (iRecvSize > 0)

  decode_IpIcmp(recv_buffer, iRecvSize);

  }

  #ifdef WIN32

  WSACleanup();

  //#else

  // ;

  #endif

  return ret;

  }

      

首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇使用C语言实现“泛型”链表 下一篇C不确定参数个数的函数的实现

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: