]> git.tdb.fi Git - libs/net.git/blob - source/inet6.cpp
Don't close socket on Communicator error
[libs/net.git] / source / inet6.cpp
1 #include <msp/strings/format.h>
2 #include "inet6.h"
3
4 using namespace std;
5
6 namespace Msp {
7 namespace Net {
8
9 Inet6Addr::Inet6Addr():
10         addr(in6addr_any),
11         port(0)
12 { }
13
14 Inet6Addr::Inet6Addr(const sockaddr_in6 &sai6):
15         addr(sai6.sin6_addr),
16         port(sai6.sin6_port)
17 { }
18
19 Inet6Addr::Inet6Addr(unsigned char a[16], in_port_t p):
20         port(p)
21 {
22         std::copy(a, a+16, addr.s6_addr);
23 }
24
25 string Inet6Addr::str() const
26 {
27         string result = "[";
28         for(unsigned i=0; i<16; i+=2)
29         {
30                 unsigned short part = (addr.s6_addr[i]<<8) | addr.s6_addr[i+1];
31                 if(i>0)
32                         result += ':';
33                 result += format("%x", part);
34         }
35         result += ']';
36         if(port)
37                 result += format(":%d", ntohs(port));
38
39         return result;
40 }
41
42 unsigned Inet6Addr::fill_sockaddr(sockaddr &) const
43 {
44         throw logic_error("sizeof(sockaddr_in6)>sizeof(sockaddr)");
45 }
46
47 unsigned Inet6Addr::fill_sockaddr(sockaddr_storage &sa) const
48 {
49         sockaddr_in6 &sai6 = reinterpret_cast<sockaddr_in6 &>(sa);
50         sai6.sin6_family = AF_INET6;
51         sai6.sin6_port = port;
52         sai6.sin6_addr = addr;
53         sai6.sin6_flowinfo = 0;
54         sai6.sin6_scope_id = 0;
55
56         return sizeof(sockaddr_in6);
57 }
58
59 } // namespace Net
60 } // namespace Msp