Mercurial > code
annotate C++/modules/Socket/SocketTcp.h @ 334:0b576ee64d45
* Create brand new hierarchy
* Rename DynLib to Dynlib
* Remove some warnings
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sun, 08 Mar 2015 14:26:33 +0100 |
parents | C++/SocketTcp.h@cba77da58496 |
children | 92457ea8f7e2 |
rev | line source |
---|---|
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * SocketTcp.h -- portable C++ socket wrappers |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
4 * Copyright (c) 2013, 2014 David Demelier <markand@malikania.fr> |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
319 | 19 #ifndef _SOCKET_TCP_NG_H_ |
20 #define _SOCKET_TCP_NG_H_ | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 #include "Socket.h" |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
24 /** |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 * @class SocketAbstractTcp |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 * @brief Base class for TCP sockets |
319 | 27 * |
28 * This abstract class provides standard TCP functions for both clear | |
29 * and SSL implementation. | |
30 * | |
31 * It does not contain default accept() and connect() because they varies too | |
32 * much between standard and SSL. Also, the accept() function return different | |
33 * types. | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 */ |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 class SocketAbstractTcp : public Socket { |
319 | 36 protected: |
37 Socket standardAccept(SocketAddress &address); | |
38 void standardConnect(const SocketAddress &address); | |
39 | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 public: |
319 | 41 /** |
42 * Construct an abstract socket from an already made socket. | |
43 * | |
44 * @param s the socket | |
45 */ | |
46 inline SocketAbstractTcp(Socket s) | |
47 : Socket(s) | |
48 { | |
49 } | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 |
319 | 51 /** |
52 * Construct a standard TCP socket. The type is automatically | |
53 * set to SOCK_STREAM. | |
54 * | |
55 * @param domain the domain | |
56 * @param protocol the protocol | |
57 * @throw SocketError on error | |
58 */ | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
59 inline SocketAbstractTcp(int domain, int protocol) |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 : Socket(domain, SOCK_STREAM, protocol) |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 { |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
62 } |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
63 |
319 | 64 /** |
65 * Listen for pending connection. | |
66 * | |
67 * @param max the maximum number | |
68 */ | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
69 void listen(int max = 128); |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
70 |
319 | 71 /** |
72 * Overloaded function. | |
73 * | |
74 * @param count the number of bytes to receive | |
75 * @return the string | |
76 * @throw SocketError on error | |
77 */ | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
78 inline std::string recv(unsigned count) |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
79 { |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
80 std::string result; |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
81 |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 result.resize(count); |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
83 auto n = recv(const_cast<char *>(result.data()), count); |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
84 result.resize(n); |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
85 |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
86 return result; |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
87 } |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
88 |
319 | 89 /** |
90 * Overloaded function. | |
91 * | |
92 * @param count the number of bytes to receive | |
93 * @param timeout the maximum timeout in milliseconds | |
94 * @return the string | |
95 * @throw SocketError on error | |
96 */ | |
316
4c0af1143fc4
Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents:
315
diff
changeset
|
97 inline std::string waitRecv(unsigned count, int timeout) |
4c0af1143fc4
Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents:
315
diff
changeset
|
98 { |
4c0af1143fc4
Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents:
315
diff
changeset
|
99 std::string result; |
4c0af1143fc4
Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents:
315
diff
changeset
|
100 |
4c0af1143fc4
Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents:
315
diff
changeset
|
101 result.resize(count); |
4c0af1143fc4
Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents:
315
diff
changeset
|
102 auto n = waitRecv(const_cast<char *>(result.data()), count, timeout); |
4c0af1143fc4
Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents:
315
diff
changeset
|
103 result.resize(n); |
4c0af1143fc4
Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents:
315
diff
changeset
|
104 |
4c0af1143fc4
Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents:
315
diff
changeset
|
105 return result; |
4c0af1143fc4
Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents:
315
diff
changeset
|
106 } |
4c0af1143fc4
Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents:
315
diff
changeset
|
107 |
319 | 108 /** |
109 * Overloaded function. | |
110 * | |
111 * @param data the string to send | |
112 * @return the number of bytes sent | |
113 * @throw SocketError on error | |
114 */ | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
115 inline unsigned send(const std::string &data) |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
116 { |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
117 return send(data.c_str(), data.size()); |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
118 } |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
119 |
319 | 120 /** |
121 * Overloaded function. | |
122 * | |
123 * @param data the string to send | |
124 * @param timeout the maximum timeout in milliseconds | |
125 * @return the number of bytes sent | |
126 * @throw SocketError on error | |
127 */ | |
316
4c0af1143fc4
Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents:
315
diff
changeset
|
128 inline unsigned waitSend(const std::string &data, int timeout) |
4c0af1143fc4
Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents:
315
diff
changeset
|
129 { |
4c0af1143fc4
Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents:
315
diff
changeset
|
130 return waitSend(data.c_str(), data.size(), timeout); |
4c0af1143fc4
Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents:
315
diff
changeset
|
131 } |
4c0af1143fc4
Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents:
315
diff
changeset
|
132 |
319 | 133 /** |
134 * Receive data. | |
135 * | |
136 * @param data the destination buffer | |
137 * @param length the buffer length | |
138 * @return the number of bytes received | |
139 * @throw SocketError on error | |
140 */ | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
141 virtual unsigned recv(void *data, unsigned length) = 0; |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
142 |
319 | 143 /** |
144 * Receive data. | |
145 * | |
146 * @param data the destination buffer | |
147 * @param length the buffer length | |
148 * @param timeout the maximum timeout in milliseconds | |
149 * @return the number of bytes received | |
150 * @throw SocketError on error | |
151 */ | |
316
4c0af1143fc4
Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents:
315
diff
changeset
|
152 virtual unsigned waitRecv(void *data, unsigned length, int timeout) = 0; |
4c0af1143fc4
Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents:
315
diff
changeset
|
153 |
319 | 154 /** |
155 * Send data. | |
156 * | |
157 * @param data the buffer | |
158 * @param length the buffer length | |
159 * @return the number of bytes sent | |
160 * @throw SocketError on error | |
161 */ | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
162 virtual unsigned send(const void *data, unsigned length) = 0; |
316
4c0af1143fc4
Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents:
315
diff
changeset
|
163 |
319 | 164 /** |
165 * Send data. | |
166 * | |
167 * @param data the buffer | |
168 * @param length the buffer length | |
169 * @return the number of bytes sent | |
170 * @throw SocketError on error | |
171 */ | |
316
4c0af1143fc4
Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents:
315
diff
changeset
|
172 virtual unsigned waitSend(const void *data, unsigned length, int timeout) = 0; |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
173 }; |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
174 |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
175 /** |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
176 * @class SocketTcp |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
177 * @brief End-user class for TCP sockets |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
178 */ |
319 | 179 class SocketTcp : public SocketAbstractTcp { |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
180 public: |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
181 using SocketAbstractTcp::SocketAbstractTcp; |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
182 using SocketAbstractTcp::recv; |
318
68ae6d7dea1f
Sockets: improve errors
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
183 using SocketAbstractTcp::waitRecv; |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
184 using SocketAbstractTcp::send; |
318
68ae6d7dea1f
Sockets: improve errors
David Demelier <markand@malikania.fr>
parents:
316
diff
changeset
|
185 using SocketAbstractTcp::waitSend; |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
186 |
319 | 187 /** |
188 * Accept a clear TCP socket. | |
189 * | |
190 * @return the socket | |
191 * @throw SocketError on error | |
192 */ | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
193 SocketTcp accept(); |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
194 |
319 | 195 /** |
196 * Accept a clear TCP socket. | |
197 * | |
198 * @param info the client information | |
199 * @return the socket | |
200 * @throw SocketError on error | |
201 */ | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
202 SocketTcp accept(SocketAddress &info); |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
203 |
319 | 204 /** |
205 * Accept a clear TCP socket. | |
206 * | |
207 * @param timeout the maximum timeout in milliseconds | |
208 * @return the socket | |
209 * @throw SocketError on error | |
210 */ | |
316
4c0af1143fc4
Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents:
315
diff
changeset
|
211 SocketTcp waitAccept(int timeout); |
4c0af1143fc4
Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents:
315
diff
changeset
|
212 |
319 | 213 /** |
214 * Accept a clear TCP socket. | |
215 * | |
216 * @param info the client information | |
217 * @param timeout the maximum timeout in milliseconds | |
218 * @return the socket | |
219 * @throw SocketError on error | |
220 */ | |
316
4c0af1143fc4
Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents:
315
diff
changeset
|
221 SocketTcp waitAccept(SocketAddress &info, int timeout); |
4c0af1143fc4
Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents:
315
diff
changeset
|
222 |
319 | 223 /** |
224 * Connect to an end point. | |
225 * | |
226 * @param address the address | |
227 * @throw SocketError on error | |
228 */ | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
229 void connect(const SocketAddress &address); |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
230 |
319 | 231 /** |
232 * Connect to an end point. | |
233 * | |
234 * @param timeout the maximum timeout in milliseconds | |
235 * @param address the address | |
236 * @throw SocketError on error | |
237 */ | |
316
4c0af1143fc4
Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents:
315
diff
changeset
|
238 void waitConnect(const SocketAddress &address, int timeout); |
4c0af1143fc4
Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents:
315
diff
changeset
|
239 |
319 | 240 /** |
241 * @copydoc SocketAbstractTcp::recv | |
242 */ | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
243 unsigned recv(void *data, unsigned length) override; |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
244 |
319 | 245 /** |
246 * @copydoc SocketAbstractTcp::waitRecv | |
247 */ | |
316
4c0af1143fc4
Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents:
315
diff
changeset
|
248 unsigned waitRecv(void *data, unsigned length, int timeout) override; |
4c0af1143fc4
Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents:
315
diff
changeset
|
249 |
319 | 250 /** |
251 * @copydoc SocketAbstractTcp::send | |
252 */ | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
253 unsigned send(const void *data, unsigned length) override; |
316
4c0af1143fc4
Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents:
315
diff
changeset
|
254 |
319 | 255 /** |
256 * @copydoc SocketAbstractTcp::waitSend | |
257 */ | |
316
4c0af1143fc4
Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents:
315
diff
changeset
|
258 unsigned waitSend(const void *data, unsigned length, int timeout) override; |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
259 }; |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
260 |
319 | 261 #endif // !_SOCKET_TCP_NG_H_ |