X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Finet6.cpp;h=79da1d2269316e2ab0931f738b2fd160f6d3b773;hb=823208d633b0c7352e436513990ecf81d9e67fd4;hp=3adad2fb58a3320125781c038c9135ff46d00cfd;hpb=2aab4004e71a2e5c773289e0be5e58aec6a8d339;p=libs%2Fnet.git diff --git a/source/inet6.cpp b/source/inet6.cpp index 3adad2f..79da1d2 100644 --- a/source/inet6.cpp +++ b/source/inet6.cpp @@ -1,6 +1,12 @@ -#include -#include +#ifdef WIN32 +#include +#include +#else +#include +#endif +#include #include "inet6.h" +#include "sockaddr_private.h" using namespace std; @@ -8,19 +14,30 @@ namespace Msp { namespace Net { Inet6Addr::Inet6Addr(): - addr(in6addr_any), port(0) -{ } +{ + fill(addr, addr+16, 0); +} -Inet6Addr::Inet6Addr(const sockaddr_in6 &sai6): - addr(sai6.sin6_addr), - port(sai6.sin6_port) -{ } +Inet6Addr::Inet6Addr(const SysAddr &sa) +{ + const sockaddr_in6 &sai6 = reinterpret_cast(sa.addr); + std::copy(sai6.sin6_addr.s6_addr, sai6.sin6_addr.s6_addr+16, addr); + port = htons(sai6.sin6_port); +} -Inet6Addr::Inet6Addr(unsigned char a[16], in_port_t p): - port(p) +SockAddr::SysAddr Inet6Addr::to_sys() const { - std::copy(a, a+16, addr.s6_addr); + SysAddr sa; + sa.size = sizeof(sockaddr_in6); + sockaddr_in6 &sai6 = reinterpret_cast(sa.addr); + sai6.sin6_family = AF_INET6; + std::copy(addr, addr+16, sai6.sin6_addr.s6_addr); + sai6.sin6_port = htons(port); + sai6.sin6_flowinfo = 0; + sai6.sin6_scope_id = 0; + + return sa; } string Inet6Addr::str() const @@ -28,34 +45,17 @@ string Inet6Addr::str() const string result = "["; for(unsigned i=0; i<16; i+=2) { - unsigned short part = (addr.s6_addr[i]<<8) | addr.s6_addr[i+1]; + unsigned short part = (addr[i]<<8) | addr[i+1]; if(i>0) result += ':'; result += format("%x", part); } result += ']'; if(port) - result += format(":%d", ntohs(port)); + result += format(":%d", port); return result; } -unsigned Inet6Addr::fill_sockaddr(sockaddr &) const -{ - throw Exception("Inet6Addr doesn't fit in struct sockaddr"); -} - -unsigned Inet6Addr::fill_sockaddr(sockaddr_storage &sa) const -{ - sockaddr_in6 &sai6 = reinterpret_cast(sa); - sai6.sin6_family = AF_INET6; - sai6.sin6_port = port; - sai6.sin6_addr = addr; - sai6.sin6_flowinfo = 0; - sai6.sin6_scope_id = 0; - - return sizeof(sockaddr_in6); -} - } // namespace Net } // namespace Msp