现在的位置: 首页 > 综合 > 正文

TraceRoute(tracert)源码(基于Window IP帮助函数实现)

2013年10月06日 ⁄ 综合 ⁄ 共 2089字 ⁄ 字号 评论关闭

 TraceRoute(tracert)源码(基于Window IP帮助函数实现) 佟强 2008.11.4

    TraceRoute实现原理 http://blog.csdn.net/microtong/archive/2008/11/04/3220450.aspx

    本程序使用Windows  IP帮助函数发送ICMP回显请求报文,实现tracert的功能,探测每一跳路由器的IP地址和往返时间。

  1. //TraceRoute2.cpp
  2. #include <stdio.h>
  3. #include <winsock2.h>
  4. #include <windows.h>
  5. #include <IPHlpApi.h>
  6. #include <IcmpAPI.h>
  7. #pragma comment(lib,"Iphlpapi.lib")
  8. #pragma comment(lib,"ws2_32.lib")
  9. int main(int argc,char* argv[]){
  10.  if(argc!=2){
  11.   printf("Usage: %s destIP/n",argv[0]);
  12.   exit(-1);
  13.  }
  14.  WSADATA wsa;
  15.  if(WSAStartup(MAKEWORD(2,2),&wsa)!=0){
  16.   printf("WSAStartup failed./n");
  17.   exit(-1);
  18.  }
  19.  //转换IP地址到整数
  20.  unsigned long ip = inet_addr(argv[1]);
  21.  if(ip==INADDR_NONE){
  22.   //用户可能输入的是域名
  23.   hostent* pHost = gethostbyname(argv[1]);
  24.   //如果域名无法解析
  25.   if(pHost==NULL){
  26.    printf("Invalid IP or domain name: %s/n", argv[1]);
  27.    exit(-1);
  28.   }
  29.   //取域名的第一个IP地址
  30.   ip = *(unsigned long*)pHost->h_addr_list[0];
  31.   printf("trace route to %s(%s)/n/n",argv[1],inet_ntoa(*(in_addr*)&ip));
  32.  }else{
  33.   printf("trace route to %s/n/n",argv[1]);
  34.  }
  35.  //打开ICMP句柄
  36.  HANDLE hIcmp;
  37.  if ((hIcmp = IcmpCreateFile()) == INVALID_HANDLE_VALUE){
  38.   printf("/tUnable to open ICMP file./n");
  39.   exit(-1);
  40.  }
  41.  //设置IP报头的TTL值
  42.  IP_OPTION_INFORMATION IpOption;
  43.  ZeroMemory(&IpOption,sizeof(IP_OPTION_INFORMATION));
  44.  IpOption.Ttl = 1;
  45.  //设置要发送的数据
  46.  char SendData[32];
  47.  memset(SendData,'0',sizeof(SendData));
  48.  //设置接收缓冲区
  49.  char ReplyBuffer[sizeof(ICMP_ECHO_REPLY)+32];
  50.  PICMP_ECHO_REPLY pEchoReply = (PICMP_ECHO_REPLY)ReplyBuffer;
  51.  BOOL bLoop = TRUE;
  52.  int iMaxHop = 30;
  53.  while(bLoop && iMaxHop--){
  54.   printf("%2d: ",IpOption.Ttl);
  55.   //发送ICMP回显请求
  56.   if(IcmpSendEcho(hIcmp,(IPAddr)ip, SendData, sizeof(SendData), &IpOption, 
  57.    ReplyBuffer, sizeof(ReplyBuffer), 3000)!=0){
  58.     if(pEchoReply->RoundTripTime==0){
  59.      printf("/t<1ms");
  60.     }else{
  61.      printf("/t%dms",pEchoReply->RoundTripTime);
  62.     }
  63.     printf("/t%s/n",inet_ntoa(*(in_addr*)&(pEchoReply->Address)));
  64.     //判断是否完成路由路径探测
  65.     if((unsigned long)pEchoReply->Address==ip){
  66.      printf("/nTrace complete./n");
  67.      bLoop = FALSE;
  68.     }
  69.   }else{
  70.    printf("/t*/tRequest time out./n");
  71.   }
  72.   IpOption.Ttl++;
  73.  }
  74.  IcmpCloseHandle(hIcmp);
  75.  WSACleanup();
  76.  return 0;
  77. }

 

抱歉!评论已关闭.