mirror of
https://github.com/moonlight-stream/Internet-Hosting-Tool.git
synced 2025-07-01 23:35:27 +00:00
Add traceroute code for experimental double NAT handling
This commit is contained in:
parent
2899843900
commit
1c9ecbfb78
@ -162,6 +162,7 @@
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="miss.cpp" />
|
||||
<ClCompile Include="tracer.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="miss.rc" />
|
||||
|
@ -18,6 +18,9 @@
|
||||
<ClCompile Include="miss.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="tracer.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="miss.rc">
|
||||
|
75
miss/tracer.cpp
Normal file
75
miss/tracer.cpp
Normal file
@ -0,0 +1,75 @@
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#define _WINSOCK_DEPRECATED_NO_WARNINGS
|
||||
#include <Windows.h>
|
||||
|
||||
#include <WinSock2.h>
|
||||
#include <WS2tcpip.h>
|
||||
#include <iphlpapi.h>
|
||||
#include <icmpapi.h>
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
bool getHopsIP4(IN_ADDR* hopAddress, int* hopAddressCount)
|
||||
{
|
||||
HANDLE icmpFile;
|
||||
struct hostent* host;
|
||||
const char* requestBuffer = "Test";
|
||||
union {
|
||||
ICMP_ECHO_REPLY replies[ANYSIZE_ARRAY];
|
||||
char replyBuffer[128];
|
||||
};
|
||||
|
||||
host = gethostbyname("google.com");
|
||||
if (host == nullptr) {
|
||||
printf("gethostbyname() failed: %d\n", WSAGetLastError());
|
||||
return false;
|
||||
}
|
||||
|
||||
icmpFile = IcmpCreateFile();
|
||||
if (icmpFile == INVALID_HANDLE_VALUE) {
|
||||
printf("IcmpCreateFile() failed: %d\n", GetLastError());
|
||||
return false;
|
||||
}
|
||||
|
||||
int ttl = 1;
|
||||
for (; ttl < *hopAddressCount; ttl++)
|
||||
{
|
||||
IP_OPTION_INFORMATION ipOptions;
|
||||
|
||||
ipOptions.Ttl = ttl;
|
||||
ipOptions.Tos = 0;
|
||||
ipOptions.Flags = 0;
|
||||
ipOptions.OptionsSize = 0;
|
||||
|
||||
DWORD replyCount = IcmpSendEcho(icmpFile,
|
||||
*(IPAddr*)host->h_addr,
|
||||
(LPVOID)requestBuffer, sizeof(requestBuffer),
|
||||
&ipOptions,
|
||||
replyBuffer, sizeof(replyBuffer),
|
||||
3000);
|
||||
if (replyCount == 0) {
|
||||
printf("IcmpSendEcho() failed: %d\n", GetLastError());
|
||||
break;
|
||||
}
|
||||
else if (replyCount != 1) {
|
||||
printf("Got extra replies: %d\n", replyCount);
|
||||
break;
|
||||
}
|
||||
|
||||
if (replies[0].Status == IP_TTL_EXPIRED_TRANSIT) {
|
||||
// Get the IP address that responded to us
|
||||
printf("Hop %d: %s\n", ttl, inet_ntoa(*(IN_ADDR*)&replies[0].Address));
|
||||
hopAddress[ttl - 1] = *(IN_ADDR*)&replies[0].Address;
|
||||
}
|
||||
else {
|
||||
// Bail on anything else
|
||||
printf("Hop %d: %s (error %d)\n", ttl, inet_ntoa(*(IN_ADDR*)&replies[0].Address), replies[0].Status);
|
||||
*hopAddressCount = ttl - 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
IcmpCloseHandle(icmpFile);
|
||||
|
||||
return true;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user