]> git.tdb.fi Git - libs/net.git/blobdiff - source/inet6.cpp
Hide platform specific parts of socket addresses
[libs/net.git] / source / inet6.cpp
index 6903a778d2998f56e03d851c7c6ba830346c7a96..79da1d2269316e2ab0931f738b2fd160f6d3b773 100644 (file)
@@ -1,5 +1,12 @@
+#ifdef WIN32
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#else
+#include <netinet/in.h>
+#endif
 #include <msp/strings/format.h>
 #include "inet6.h"
+#include "sockaddr_private.h"
 
 using namespace std;
 
@@ -7,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<const sockaddr_in6 &>(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<sockaddr_in6 &>(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
@@ -27,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 logic_error("sizeof(sockaddr_in6)>sizeof(sockaddr)");
-}
-
-unsigned Inet6Addr::fill_sockaddr(sockaddr_storage &sa) const
-{
-       sockaddr_in6 &sai6 = reinterpret_cast<sockaddr_in6 &>(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