Fix ipv6 on windows

This commit is contained in:
proller 2013-06-24 20:12:54 +04:00
parent 30d6d4c733
commit e47f6fdfe9

@ -185,11 +185,41 @@ void Address::Resolve(const char *name)
// IP address -> textual representation // IP address -> textual representation
std::string Address::serializeString() const std::string Address::serializeString() const
{ {
// windows XP doesnt have inet_ntop, maybe use better func
#ifdef _WIN32
if(m_addr_family == AF_INET)
{
u8 a, b, c, d, addr;
addr = ntohl(m_address.ipv4.sin_addr.s_addr);
a = (addr & 0xFF000000) >> 24;
b = (addr & 0x00FF0000) >> 16;
c = (addr & 0x0000FF00) >> 8;
d = (addr & 0x000000FF);
return itos(a) + "." + itos(b) + "." + itos(c) + "." + itos(d);
}
else if(m_addr_family == AF_INET6)
{
std::ostringstream os;
for(int i = 0; i < 16; i += 2)
{
u16 section =
(m_address.ipv6.sin6_addr.s6_addr[i] << 8) |
(m_address.ipv6.sin6_addr.s6_addr[i + 1]);
os << std::hex << section;
if(i < 14)
os << ":";
}
return os.str();
}
else
return std::string("");
#else
char str[INET6_ADDRSTRLEN]; char str[INET6_ADDRSTRLEN];
if (inet_ntop(m_addr_family, (m_addr_family == AF_INET) ? (void*)&(m_address.ipv4.sin_addr) : (void*)&(m_address.ipv6.sin6_addr), str, INET6_ADDRSTRLEN) == NULL) { if (inet_ntop(m_addr_family, (m_addr_family == AF_INET) ? (void*)&(m_address.ipv4.sin_addr) : (void*)&(m_address.ipv6.sin6_addr), str, INET6_ADDRSTRLEN) == NULL) {
return std::string(""); return std::string("");
} }
return std::string(str); return std::string(str);
#endif
} }
struct sockaddr_in Address::getAddress() const struct sockaddr_in Address::getAddress() const