Mercurial > code
annotate C++/SocketAddress.cpp @ 173:18ad49172e6c
Update documentation and add Unix sockets
author | David Demelier <markand@malikania.fr> |
---|---|
date | Thu, 12 Sep 2013 11:23:08 +0200 |
parents | fd138f2a9773 |
children | ce3e1c3d6fed |
rev | line source |
---|---|
170 | 1 /* |
2 * SocketAddress.cpp -- socket addresses management | |
3 * | |
4 * Copyright (c) 2013, David Demelier <markand@malikania.fr> | |
5 * | |
6 * Permission to use, copy, modify, and/or distribute this software for any | |
7 * purpose with or without fee is hereby granted, provided that the above | |
8 * copyright notice and this permission notice appear in all copies. | |
9 * | |
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
17 */ | |
18 | |
173
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
19 #include <cerrno> |
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
20 #include <cstdio> |
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
21 #include <cstring> |
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
22 |
170 | 23 #include "SocketAddress.h" |
24 | |
25 /* -------------------------------------------------------- | |
26 * BindAddressIP implementation | |
27 * -------------------------------------------------------- */ | |
28 | |
29 BindAddressIP::BindAddressIP(const std::string &iface, unsigned port, int family) | |
30 : m_host(iface) | |
31 , m_family(family) | |
32 , m_port(port) | |
33 { | |
34 if (m_family == AF_INET6) | |
35 { | |
36 sockaddr_in6 *ptr = (sockaddr_in6 *)&m_addr; | |
37 | |
38 ptr->sin6_family = AF_INET6; | |
39 ptr->sin6_port = htons(m_port); | |
40 | |
41 if (m_host == "*") | |
42 ptr->sin6_addr = in6addr_any; | |
43 else if (inet_pton(AF_INET6, m_host.c_str(), &ptr->sin6_addr) <= 0) | |
44 throw SocketError(Socket::getLastSysError()); | |
45 | |
46 m_addrlen = sizeof (sockaddr_in6); | |
47 } | |
48 else | |
49 { | |
50 sockaddr_in *ptr = (sockaddr_in *)&m_addr; | |
51 | |
52 ptr->sin_family = AF_INET; | |
53 ptr->sin_port = htons(m_port); | |
54 | |
55 if (m_host == "*") | |
56 ptr->sin_addr.s_addr = INADDR_ANY; | |
57 else if (inet_pton(AF_INET, m_host.c_str(), &ptr->sin_addr) <= 0) | |
58 throw SocketError(Socket::getLastSysError()); | |
59 | |
60 m_addrlen = sizeof (sockaddr_in); | |
61 } | |
62 } | |
63 | |
64 /* -------------------------------------------------------- | |
65 * ConnectAddressIP implementation | |
66 * -------------------------------------------------------- */ | |
67 | |
68 ConnectAddressIP::ConnectAddressIP(const std::string &host, unsigned port, int family, int type) | |
69 { | |
70 addrinfo hints, *res; | |
71 int error; | |
72 | |
73 memset(&hints, 0, sizeof (hints)); | |
74 hints.ai_family = family; | |
75 hints.ai_socktype = type; | |
76 | |
77 error = getaddrinfo(host.c_str(), std::to_string(port).c_str(), &hints, &res); | |
78 if (error) | |
79 throw SocketError(gai_strerrorA(error)); | |
80 | |
81 memcpy(&m_addr, res->ai_addr, res->ai_addrlen); | |
82 m_addrlen = res->ai_addrlen; | |
83 | |
84 freeaddrinfo(res); | |
85 } | |
86 | |
87 /* -------------------------------------------------------- | |
173
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
88 * AddressUnix implementation |
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
89 * -------------------------------------------------------- */ |
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
90 |
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
91 #if !defined(_WIN32) |
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
92 |
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
93 #include <sys/un.h> |
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
94 |
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
95 AddressUnix::AddressUnix(const std::string &path, bool rm) |
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
96 { |
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
97 sockaddr_un *sun = (sockaddr_un *)&m_addr; |
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
98 |
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
99 // Silently remove the file even if it fails |
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
100 if (rm) |
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
101 ::remove(path.c_str()); |
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
102 |
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
103 // Copy the path |
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
104 memset(sun->sun_path, 0, sizeof (sun->sun_path)); |
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
105 strncpy(sun->sun_path, path.c_str(), sizeof (sun->sun_path) - 1); |
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
106 |
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
107 // Set the parameters |
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
108 sun->sun_family = AF_UNIX; |
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
109 sun->sun_len = SUN_LEN(sun); |
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
110 m_addrlen = SUN_LEN(sun); |
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
111 } |
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
112 |
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
113 #endif // _WIN32 |
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
114 |
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
115 /* -------------------------------------------------------- |
170 | 116 * SocketAddress implementation |
117 * -------------------------------------------------------- */ | |
118 | |
119 SocketAddress::SocketAddress() | |
120 : m_addrlen(0) | |
121 { | |
122 memset(&m_addr, 0, sizeof (m_addr)); | |
123 } | |
124 | |
125 SocketAddress::SocketAddress(const sockaddr_storage &addr, socklen_t length) | |
126 : m_addr(addr) | |
127 , m_addrlen(length) | |
128 { | |
129 } | |
130 | |
131 SocketAddress::~SocketAddress() | |
132 { | |
133 } | |
134 | |
135 const sockaddr_storage &SocketAddress::address() const | |
136 { | |
137 return m_addr; | |
138 } | |
139 | |
140 socklen_t SocketAddress::length() const | |
141 { | |
142 return m_addrlen; | |
143 } |