|
|
@ -62,16 +62,21 @@ namespace net |
|
|
|
#ifdef WIN32 |
|
|
|
#ifdef WIN32 |
|
|
|
bool IsWindowsXPorLater() |
|
|
|
bool IsWindowsXPorLater() |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
static bool isRequested = false; |
|
|
|
|
|
|
|
static bool isXP = false; |
|
|
|
|
|
|
|
if (!isRequested) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
// request
|
|
|
|
OSVERSIONINFO osvi; |
|
|
|
OSVERSIONINFO osvi; |
|
|
|
|
|
|
|
|
|
|
|
ZeroMemory(&osvi, sizeof(OSVERSIONINFO)); |
|
|
|
ZeroMemory(&osvi, sizeof(OSVERSIONINFO)); |
|
|
|
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); |
|
|
|
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); |
|
|
|
GetVersionEx(&osvi); |
|
|
|
GetVersionEx(&osvi); |
|
|
|
|
|
|
|
|
|
|
|
if (osvi.dwMajorVersion <= 5) |
|
|
|
isXP = osvi.dwMajorVersion <= 5; |
|
|
|
return true; |
|
|
|
isRequested = true; |
|
|
|
else |
|
|
|
} |
|
|
|
return false; |
|
|
|
return isXP; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int GetMTUWindowsIpv4(sockaddr_in inputAddress, int fallback) |
|
|
|
int GetMTUWindowsIpv4(sockaddr_in inputAddress, int fallback) |
|
|
@ -202,7 +207,7 @@ namespace net |
|
|
|
std::string localAddressUniversal = localAddress.to_string(); |
|
|
|
std::string localAddressUniversal = localAddress.to_string(); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
if (IsWindowsXPorLater()) |
|
|
|
bool isXP = IsWindowsXPorLater(); |
|
|
|
{ |
|
|
|
{ |
|
|
|
#define inet_pton inet_pton_xp |
|
|
|
#define inet_pton inet_pton_xp |
|
|
|
} |
|
|
|
} |
|
|
@ -210,12 +215,18 @@ namespace net |
|
|
|
if(localAddress.is_v4()) |
|
|
|
if(localAddress.is_v4()) |
|
|
|
{ |
|
|
|
{ |
|
|
|
sockaddr_in inputAddress; |
|
|
|
sockaddr_in inputAddress; |
|
|
|
|
|
|
|
if (isXP) |
|
|
|
|
|
|
|
inet_pton_xp(AF_INET, localAddressUniversal.c_str(), &(inputAddress.sin_addr)); |
|
|
|
|
|
|
|
else |
|
|
|
inet_pton(AF_INET, localAddressUniversal.c_str(), &(inputAddress.sin_addr)); |
|
|
|
inet_pton(AF_INET, localAddressUniversal.c_str(), &(inputAddress.sin_addr)); |
|
|
|
return GetMTUWindowsIpv4(inputAddress, fallback); |
|
|
|
return GetMTUWindowsIpv4(inputAddress, fallback); |
|
|
|
} |
|
|
|
} |
|
|
|
else if(localAddress.is_v6()) |
|
|
|
else if(localAddress.is_v6()) |
|
|
|
{ |
|
|
|
{ |
|
|
|
sockaddr_in6 inputAddress; |
|
|
|
sockaddr_in6 inputAddress; |
|
|
|
|
|
|
|
if (isXP) |
|
|
|
|
|
|
|
inet_pton_xp(AF_INET6, localAddressUniversal.c_str(), &(inputAddress.sin6_addr)); |
|
|
|
|
|
|
|
else |
|
|
|
inet_pton(AF_INET6, localAddressUniversal.c_str(), &(inputAddress.sin6_addr)); |
|
|
|
inet_pton(AF_INET6, localAddressUniversal.c_str(), &(inputAddress.sin6_addr)); |
|
|
|
return GetMTUWindowsIpv6(inputAddress, fallback); |
|
|
|
return GetMTUWindowsIpv6(inputAddress, fallback); |
|
|
|
} else { |
|
|
|
} else { |
|
|
|