#include <iphlpapi.h>
#include <icmpapi.h>
#pragma comment(lib,"iphlpapi.lib")
vector<string> GetAllTraceRouterIpAddr(string strTraceIp)//输入目的ip地址
{
WSADATA wsa;
vector<string> vecRouterIpAddr;
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
{
return vecRouterIpAddr;
}
unsigned long lIpAddr = inet_addr(strTraceIp.c_str());
if (lIpAddr == INADDR_NONE)
{
//if strTraceIp is a domain name
hostent* pHost = gethostbyname(strTraceIp.c_str());
if (pHost == NULL)
{
return vecRouterIpAddr;
}
}
//open ICMP handle
HANDLE hIcmp = IcmpCreateFile();
if (hIcmp == INVALID_HANDLE_VALUE)
{
return vecRouterIpAddr;
}
//set ttl value
IP_OPTION_INFORMATION IpOption;
ZeroMemory(&IpOption, sizeof(IP_OPTION_INFORMATION));
IpOption.Ttl = 1;
char SendData[32];
memset(SendData, '0', sizeof(SendData));
char ReplyBuffer[sizeof(ICMP_ECHO_REPLY) + 32];
PICMP_ECHO_REPLY pEchoReply = (PICMP_ECHO_REPLY)ReplyBuffer;
int iMaxHop = 30;
while (iMaxHop--)
{
int ttl = IpOption.Ttl;
//send icmp request
if (IcmpSendEcho(hIcmp, (IPAddr)lIpAddr, SendData, sizeof(SendData), &IpOption, ReplyBuffer, sizeof(ReplyBuffer), 3000) != 0)
{
string strIp = inet_ntoa(*(in_addr*)&(pEchoReply->Address));
vecRouterIpAddr.push_back(strIp);
if ((unsigned long)pEchoReply->Address == lIpAddr)
{
break;
}
}
IpOption.Ttl++;
}
IcmpCloseHandle(hIcmp);
WSACleanup();
return vecRouterIpAddr;
}
获取一个ip地址所经过的所有网关
最新推荐文章于 2024-03-25 00:07:21 发布