]> git.tdb.fi Git - libs/net.git/blob - source/inet.cpp
Add an overload for resolve that takes host and service separately
[libs/net.git] / source / inet.cpp
1 #ifdef WIN32
2 #include <winsock2.h>
3 #else
4 #include <netinet/in.h>
5 #endif
6 #include <msp/strings/format.h>
7 #include "inet.h"
8 #include "sockaddr_private.h"
9
10 using namespace std;
11
12 namespace Msp {
13 namespace Net {
14
15 InetAddr::InetAddr():
16         port(0)
17 {
18         fill(addr, addr+4, 0);
19 }
20
21 InetAddr::InetAddr(const SysAddr &sa)
22 {
23         const sockaddr_in &sai = reinterpret_cast<const sockaddr_in &>(sa.addr);
24         addr[0] = sai.sin_addr.s_addr>>24;
25         addr[1] = sai.sin_addr.s_addr>>16;
26         addr[2] = sai.sin_addr.s_addr>>8;
27         addr[3] = sai.sin_addr.s_addr;
28         port = ntohs(sai.sin_port);
29 }
30
31 SockAddr::SysAddr InetAddr::to_sys() const
32 {
33         SysAddr sa;
34         sa.size = sizeof(sockaddr_in);
35         sockaddr_in &sai = reinterpret_cast<sockaddr_in &>(sa.addr);
36         sai.sin_family = AF_INET;
37         sai.sin_addr.s_addr = (addr[0]<<24) | (addr[1]<<16) | (addr[2]<<8) | (addr[3]);
38         sai.sin_port = htons(port);
39
40         return sa;
41 }
42
43 string InetAddr::str() const
44 {
45         string result = format("%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]);
46         if(port)
47                 result += format(":%d", port);
48         return result;
49 }
50
51 } // namespace Net
52 } // namespace Msp