]> git.tdb.fi Git - libs/net.git/blob - source/net/inet6.cpp
Add a utility struct for parsing complex header values
[libs/net.git] / source / net / inet6.cpp
1 #ifdef WIN32
2 #include <winsock2.h>
3 #include <ws2tcpip.h>
4 #else
5 #include <netinet/in.h>
6 #endif
7 #include <msp/strings/format.h>
8 #include "inet6.h"
9 #include "sockaddr_private.h"
10
11 using namespace std;
12
13 namespace Msp {
14 namespace Net {
15
16 Inet6Addr::Inet6Addr():
17         port(0)
18 {
19         fill(addr, addr+16, 0);
20 }
21
22 Inet6Addr::Inet6Addr(const SysAddr &sa)
23 {
24         const sockaddr_in6 &sai6 = reinterpret_cast<const sockaddr_in6 &>(sa.addr);
25         std::copy(sai6.sin6_addr.s6_addr, sai6.sin6_addr.s6_addr+16, addr);
26         port = htons(sai6.sin6_port);
27 }
28
29 SockAddr::SysAddr Inet6Addr::to_sys() const
30 {
31         SysAddr sa;
32         sa.size = sizeof(sockaddr_in6);
33         sockaddr_in6 &sai6 = reinterpret_cast<sockaddr_in6 &>(sa.addr);
34         sai6.sin6_family = AF_INET6;
35         std::copy(addr, addr+16, sai6.sin6_addr.s6_addr);
36         sai6.sin6_port = htons(port);
37         sai6.sin6_flowinfo = 0;
38         sai6.sin6_scope_id = 0;
39
40         return sa;
41 }
42
43 string Inet6Addr::str() const
44 {
45         string result = "[";
46         for(unsigned i=0; i<16; i+=2)
47         {
48                 unsigned short part = (addr[i]<<8) | addr[i+1];
49                 if(i>0)
50                         result += ':';
51                 result += format("%x", part);
52         }
53         result += ']';
54         if(port)
55                 result += format(":%d", port);
56
57         return result;
58 }
59
60 } // namespace Net
61 } // namespace Msp