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