annotate C++/SocketAddress.cpp @ 212:35e34b0b80d4

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