From d26395ba6dda8971d2433da3ad4603f008d6e0a1 Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 8 Jun 2016 18:45:56 +0200 Subject: [PATCH] Network/Windows: Fix build on some plateforms (Hi MinGW) Former-commit-id: d8bab0668373c3e8f6f15296e7d19d4547559fce [formerly 46afd404ab3cf4bfd8e1981cc20574707dbf703c] Former-commit-id: 29c558c519e2783641b87747de4215cd9652e1b2 --- src/Nazara/Network/Win32/IpAddressImpl.cpp | 29 ++++++++++++++++------ 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/Nazara/Network/Win32/IpAddressImpl.cpp b/src/Nazara/Network/Win32/IpAddressImpl.cpp index 54d8ee4f5..0fd5cd88a 100644 --- a/src/Nazara/Network/Win32/IpAddressImpl.cpp +++ b/src/Nazara/Network/Win32/IpAddressImpl.cpp @@ -84,16 +84,21 @@ namespace Nz { sockaddr_in* ipv4 = reinterpret_cast(info->ai_addr); - auto& rawIpV4 = ipv4->sin_addr.S_un.S_un_b; - return IpAddress(rawIpV4.s_b1, rawIpV4.s_b2, rawIpV4.s_b3, rawIpV4.s_b4, ntohs(ipv4->sin_port)); + auto& rawIpV4 = ipv4->sin_addr; + return IpAddress(rawIpV4.s_net, rawIpV4.s_host, rawIpV4.s_lh, rawIpV4.s_impno, ntohs(ipv4->sin_port)); } case AF_INET6: { sockaddr_in6* ipv6 = reinterpret_cast(info->ai_addr); - auto& rawIpV6 = ipv6->sin6_addr.u.Word; - return IpAddress(rawIpV6[0], rawIpV6[1], rawIpV6[2], rawIpV6[3], rawIpV6[4], rawIpV6[5], rawIpV6[6], rawIpV6[7], ntohs(ipv6->sin6_port)); + auto& rawIpV6 = ipv6->sin6_addr.s6_addr; + + IpAddress::IPv6 structIpV6; + for (unsigned int i = 0; i < 8; ++i) + structIpV6[i] = UInt16(rawIpV6[i * 2]) << 8 | UInt16(rawIpV6[i * 2 + 1]); + + return IpAddress(structIpV6, ntohs(ipv6->sin6_port)); } } @@ -146,8 +151,13 @@ namespace Nz IpAddress IpAddressImpl::FromSockAddr(const sockaddr_in6* addressv6) { - auto& rawIpV6 = addressv6->sin6_addr.u.Word; - return IpAddress(rawIpV6[0], rawIpV6[1], rawIpV6[2], rawIpV6[3], rawIpV6[4], rawIpV6[5], rawIpV6[6], rawIpV6[7], ntohs(addressv6->sin6_port)); + auto& rawIpV6 = addressv6->sin6_addr.s6_addr; + + IpAddress::IPv6 ipv6; + for (unsigned int i = 0; i < 8; ++i) + ipv6[i] = rawIpV6[i*2] << 8 | rawIpV6[i*2+1]; + + return IpAddress(ipv6, ntohs(addressv6->sin6_port)); } bool IpAddressImpl::ResolveAddress(const IpAddress& ipAddress, String* hostname, String* service, ResolveError* error) @@ -223,7 +233,7 @@ namespace Nz std::memset(socketAddress, 0, sizeof(sockaddr_in)); socketAddress->sin_family = AF_INET; socketAddress->sin_port = htons(ipAddress.GetPort()); - socketAddress->sin_addr.S_un.S_addr = htonl(ipAddress.ToUInt32()); + socketAddress->sin_addr.s_addr = htonl(ipAddress.ToUInt32()); return sizeof(sockaddr_in); } @@ -238,7 +248,10 @@ namespace Nz IpAddress::IPv6 address = ipAddress.ToIPv6(); for (unsigned int i = 0; i < 8; ++i) - socketAddress->sin6_addr.u.Word[i] = htons(address[i]); + { + socketAddress->sin6_addr.s6_addr[i * 2 + 0] = htons(address[i]) >> 8; + socketAddress->sin6_addr.s6_addr[i * 2 + 1] = htons(address[i]) >> 0; + } return sizeof(sockaddr_in6); }