annotate C++/SocketAddress.h @ 293:9b3270513f40

Socket: accept() can also block
author David Demelier <markand@malikania.fr>
date Thu, 13 Nov 2014 21:03:12 +0100
parents ea55a3886da0
children 836903141476 24085fae3162
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.h -- 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
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #ifndef _SOCKET_ADDRESS_H_
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #define _SOCKET_ADDRESS_H_
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
21
273
4b2e82992765 Socket: SocketAddress also require string header
David Demelier <markand@malikania.fr>
parents: 272
diff changeset
22 #include <string>
4b2e82992765 Socket: SocketAddress also require string header
David Demelier <markand@malikania.fr>
parents: 272
diff changeset
23
272
6e3b7b9cdfa0 Socket: SocketAddress lacks headers for sockaddr_storage
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
24 #if defined(_WIN32)
6e3b7b9cdfa0 Socket: SocketAddress lacks headers for sockaddr_storage
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
25 # include <Winsock2.h>
282
ea55a3886da0 Socket:
David Demelier <markand@malikania.fr>
parents: 273
diff changeset
26 # include <Ws2tcpip.h>
272
6e3b7b9cdfa0 Socket: SocketAddress lacks headers for sockaddr_storage
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
27 #else
6e3b7b9cdfa0 Socket: SocketAddress lacks headers for sockaddr_storage
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
28 # include <sys/socket.h>
6e3b7b9cdfa0 Socket: SocketAddress lacks headers for sockaddr_storage
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
29 #endif
6e3b7b9cdfa0 Socket: SocketAddress lacks headers for sockaddr_storage
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
30
173
18ad49172e6c Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
31 /**
18ad49172e6c Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
32 * @class SocketAddress
18ad49172e6c Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
33 * @brief base class for socket addresses
18ad49172e6c Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
34 *
18ad49172e6c Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
35 * This class is mostly used to bind, connect or getting information
18ad49172e6c Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
36 * on socket clients.
18ad49172e6c Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
37 *
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
38 * @see Internet
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
39 * @see Unix
173
18ad49172e6c Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
40 */
188
ce3e1c3d6fed Update sockets to style and using instead of typedef
David Demelier <markand@malikania.fr>
parents: 173
diff changeset
41 class SocketAddress {
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 protected:
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 sockaddr_storage m_addr;
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 socklen_t m_addrlen;
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
45
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 public:
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 /**
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 * Default constructor.
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 */
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 SocketAddress();
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 /**
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 * Constructor with address and size.
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 *
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 * @param addr the address
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 * @param length the address length
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 */
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 SocketAddress(const sockaddr_storage &addr, socklen_t length);
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 * Default destructor.
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 */
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
63 virtual ~SocketAddress() = default;
170
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 /**
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 * Get the address length
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 *
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 * @return the length
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 socklen_t length() const;
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
71
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 /**
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 * Get the address.
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 *
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 * @return the address
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 */
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 const sockaddr_storage &address() const;
246
9cfa6fbc9c03 Socket: add operators for SocketAddress
David Demelier <markand@malikania.fr>
parents: 245
diff changeset
78
9cfa6fbc9c03 Socket: add operators for SocketAddress
David Demelier <markand@malikania.fr>
parents: 245
diff changeset
79 /**
9cfa6fbc9c03 Socket: add operators for SocketAddress
David Demelier <markand@malikania.fr>
parents: 245
diff changeset
80 * Compare the addresses. The check is lexicographical.
9cfa6fbc9c03 Socket: add operators for SocketAddress
David Demelier <markand@malikania.fr>
parents: 245
diff changeset
81 *
9cfa6fbc9c03 Socket: add operators for SocketAddress
David Demelier <markand@malikania.fr>
parents: 245
diff changeset
82 * @param s1 the first address
9cfa6fbc9c03 Socket: add operators for SocketAddress
David Demelier <markand@malikania.fr>
parents: 245
diff changeset
83 * @param s2 the second address
9cfa6fbc9c03 Socket: add operators for SocketAddress
David Demelier <markand@malikania.fr>
parents: 245
diff changeset
84 * @return true if s1 is less than s2
9cfa6fbc9c03 Socket: add operators for SocketAddress
David Demelier <markand@malikania.fr>
parents: 245
diff changeset
85 */
9cfa6fbc9c03 Socket: add operators for SocketAddress
David Demelier <markand@malikania.fr>
parents: 245
diff changeset
86 friend bool operator<(const SocketAddress &s1, const SocketAddress &s2);
9cfa6fbc9c03 Socket: add operators for SocketAddress
David Demelier <markand@malikania.fr>
parents: 245
diff changeset
87
9cfa6fbc9c03 Socket: add operators for SocketAddress
David Demelier <markand@malikania.fr>
parents: 245
diff changeset
88 /**
9cfa6fbc9c03 Socket: add operators for SocketAddress
David Demelier <markand@malikania.fr>
parents: 245
diff changeset
89 * Compare the addresses.
9cfa6fbc9c03 Socket: add operators for SocketAddress
David Demelier <markand@malikania.fr>
parents: 245
diff changeset
90 *
9cfa6fbc9c03 Socket: add operators for SocketAddress
David Demelier <markand@malikania.fr>
parents: 245
diff changeset
91 * @param s1 the first address
9cfa6fbc9c03 Socket: add operators for SocketAddress
David Demelier <markand@malikania.fr>
parents: 245
diff changeset
92 * @param s2 the second address
9cfa6fbc9c03 Socket: add operators for SocketAddress
David Demelier <markand@malikania.fr>
parents: 245
diff changeset
93 * @return true if s1 == s2
9cfa6fbc9c03 Socket: add operators for SocketAddress
David Demelier <markand@malikania.fr>
parents: 245
diff changeset
94 */
9cfa6fbc9c03 Socket: add operators for SocketAddress
David Demelier <markand@malikania.fr>
parents: 245
diff changeset
95 friend bool operator==(const SocketAddress &s1, const SocketAddress &s2);
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 };
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
97
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
98 namespace address {
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
99
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 /**
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
101 * @class Internet
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 * @brief internet protocol connect class
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 *
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 * Create a connect address for internet protocol,
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 * using getaddrinfo(3).
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 */
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
107 class Internet final : public SocketAddress {
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 public:
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 /**
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
110 * Create an IPv4 or IPV6 end point.
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 *
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 * @param host the hostname
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 * @param port the port
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 * @param family AF_INET, AF_INET6, ...
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 * @throw SocketError on error
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 */
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
117 Internet(const std::string &host, unsigned port, int family);
170
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
173
18ad49172e6c Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
120 #if !defined(_WIN32)
18ad49172e6c Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
121
18ad49172e6c Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
122 /**
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
123 * @class Unix
173
18ad49172e6c Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
124 * @brief unix family sockets
18ad49172e6c Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
125 *
18ad49172e6c Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
126 * Create an address to a specific path. Only available on Unix.
18ad49172e6c Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
127 */
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
128 class Unix final : public SocketAddress {
173
18ad49172e6c Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
129 public:
18ad49172e6c Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
130 /**
18ad49172e6c Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
131 * Construct an address to a path.
18ad49172e6c Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
132 *
18ad49172e6c Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
133 * @param path the path
18ad49172e6c Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
134 * @param rm remove the file before (default: false)
18ad49172e6c Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
135 */
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
136 Unix(const std::string &path, bool rm = false);
173
18ad49172e6c Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
137 };
18ad49172e6c Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
138
260
2096edb63a4f Socket: fix Windows
David Demelier <markand@malikania.fr>
parents: 246
diff changeset
139 #endif // ! !_WIN32
2096edb63a4f Socket: fix Windows
David Demelier <markand@malikania.fr>
parents: 246
diff changeset
140
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
141 } // !address
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
142
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 #endif // !_SOCKET_ADDRESS_H_