+#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;
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
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