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>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="miss.cpp" />
|
<ClCompile Include="miss.cpp" />
|
||||||
|
<ClCompile Include="tracer.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ResourceCompile Include="miss.rc" />
|
<ResourceCompile Include="miss.rc" />
|
||||||
|
@ -18,6 +18,9 @@
|
|||||||
<ClCompile Include="miss.cpp">
|
<ClCompile Include="miss.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="tracer.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ResourceCompile Include="miss.rc">
|
<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