]> git.tdb.fi Git - libs/net.git/blob - source/inet6.cpp
Add function to check if handshake is done
[libs/net.git] / source / inet6.cpp
1 /* $Id$
2
3 This file is part of libmspnet
4 Copyright © 2011  Mikkosoft Productions, Mikko Rasa
5 Distributed under the LGPL
6 */
7
8 #include <msp/core/except.h>
9 #include <msp/strings/formatter.h>
10 #include "inet6.h"
11
12 using namespace std;
13
14 namespace Msp {
15 namespace Net {
16
17 Inet6Addr::Inet6Addr():
18         addr(in6addr_any),
19         port(0)
20 { }
21
22 Inet6Addr::Inet6Addr(const sockaddr_in6 &sai6):
23         addr(sai6.sin6_addr),
24         port(sai6.sin6_port)
25 { }
26
27 Inet6Addr::Inet6Addr(unsigned char a[16], in_port_t p):
28         port(p)
29 {
30         std::copy(a, a+16, addr.s6_addr);
31 }
32
33 string Inet6Addr::str() const
34 {
35         string result = "[";
36         for(unsigned i=0; i<16; i+=2)
37         {
38                 unsigned short part = (addr.s6_addr[i]<<8) | addr.s6_addr[i+1];
39                 if(i>0)
40                         result += ':';
41                 result += format("%x", part);
42         }
43         result += ']';
44         if(port)
45                 result += format(":%d", ntohs(port));
46
47         return result;
48 }
49
50 unsigned Inet6Addr::fill_sockaddr(sockaddr &) const
51 {
52         throw Exception("Inet6Addr doesn't fit in struct sockaddr");
53 }
54
55 unsigned Inet6Addr::fill_sockaddr(sockaddr_storage &sa) const
56 {
57         sockaddr_in6 &sai6 = reinterpret_cast<sockaddr_in6 &>(sa);
58         sai6.sin6_family = AF_INET6;
59         sai6.sin6_port = port;
60         sai6.sin6_addr = addr;
61         sai6.sin6_flowinfo = 0;
62         sai6.sin6_scope_id = 0;
63
64         return sizeof(sockaddr_in6);
65 }
66
67 } // namespace Net
68 } // namespace Msp