]> git.tdb.fi Git - libs/net.git/blob - source/net/inet.cpp
Add a dynamic receiver class for more flexible packet handling
[libs/net.git] / source / net / inet.cpp
1 #include "platform_api.h"
2 #include "inet.h"
3 #include <msp/strings/format.h>
4 #include "sockaddr_private.h"
5
6 using namespace std;
7
8 namespace Msp {
9 namespace Net {
10
11 InetAddr::InetAddr(const SysAddr &sa)
12 {
13         const sockaddr_in &sai = reinterpret_cast<const sockaddr_in &>(sa.addr);
14         const char *ptr = reinterpret_cast<const char *>(&sai.sin_addr.s_addr);
15         std::copy(ptr, ptr+4, addr);
16         port = ntohs(sai.sin_port);
17 }
18
19 InetAddr InetAddr::wildcard(unsigned port)
20 {
21         InetAddr addr;
22         addr.port = port;
23         return addr;
24 }
25
26 InetAddr InetAddr::localhost(unsigned port)
27 {
28         InetAddr addr;
29         addr.addr[0] = 127;
30         addr.addr[3] = 1;
31         addr.port = port;
32         return addr;
33 }
34
35 SockAddr::SysAddr InetAddr::to_sys() const
36 {
37         SysAddr sa;
38         sa.size = sizeof(sockaddr_in);
39         sockaddr_in &sai = reinterpret_cast<sockaddr_in &>(sa.addr);
40         sai.sin_family = AF_INET;
41         char *ptr = reinterpret_cast<char *>(&sai.sin_addr.s_addr);
42         std::copy(addr, addr+4, ptr);
43         sai.sin_port = htons(port);
44
45         return sa;
46 }
47
48 string InetAddr::str() const
49 {
50         string result = format("%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]);
51         if(port)
52                 result += format(":%d", port);
53         return result;
54 }
55
56 } // namespace Net
57 } // namespace Msp