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


     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. }


     

  • 相关阅读:
    WCF中的自定义类中包括自定义枚举类型时出错
    Asp.Net无刷新上传并裁剪头像
    C# 字符串模糊查找
    .NET中如何通过文本框中按回车键进行的提交数据
    关于Firefox、Safari 与IE区别实际应用的一点心得
    ASP.NET 网速慢时候按钮禁止重复提交
    ASP.NET前台代码绑定后台变量方法总结
    验证功能在IE中没问题,在火狐浏览器中无反应
    aspx 后台cs文件动态修改Lable 样式
    asp.net程序调试 连接池和 "Timeout expired"异常
  • 原文地址:https://www.cnblogs.com/zhangyunlin/p/6168126.html
Copyright © 2020-2023  润新知