Mercurial > code
annotate C++/Socket.h @ 211:04aa866535fb
Merge
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sat, 22 Mar 2014 22:02:24 +0100 |
parents | ce3e1c3d6fed |
children | ff2db0ed78f1 |
rev | line source |
---|---|
170 | 1 /* |
2 * Socket.h -- portable C++ socket wrappers | |
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 | |
19 #ifndef _SOCKET_H_ | |
20 #define _SOCKET_H_ | |
21 | |
22 #include <exception> | |
23 #include <memory> | |
24 #include <string> | |
25 | |
26 #if defined(_WIN32) | |
27 # include <WinSock2.h> | |
28 # include <WS2tcpip.h> | |
29 #else | |
30 # include <sys/ioctl.h> | |
31 # include <sys/socket.h> | |
32 # include <sys/types.h> | |
33 | |
34 # include <arpa/inet.h> | |
35 | |
36 # include <netinet/in.h> | |
37 | |
38 # include <fcntl.h> | |
39 # include <netdb.h> | |
40 # include <unistd.h> | |
41 | |
42 # define ioctlsocket(s, p, a) ::ioctl(s, p, a) | |
43 # define closesocket(s) ::close(s) | |
44 | |
45 # define gai_strerrorA gai_strerror | |
46 | |
47 # define INVALID_SOCKET -1 | |
48 # define SOCKET_ERROR -1 | |
49 #endif | |
50 | |
51 class SocketAddress; | |
52 | |
53 /** | |
54 * @class SocketError | |
55 * @brief socket error reporting | |
56 * | |
57 * This class is mainly used in all socket operations that may fail. | |
58 */ | |
188
ce3e1c3d6fed
Update sockets to style and using instead of typedef
David Demelier <markand@malikania.fr>
parents:
175
diff
changeset
|
59 class SocketError : public std::exception { |
170 | 60 private: |
61 std::string m_error; | |
62 | |
63 public: | |
64 SocketError(const std::string &error); | |
65 | |
66 virtual const char * what(void) const throw(); | |
67 }; | |
68 | |
69 /** | |
70 * @class Socket | |
71 * @brief socket abstraction | |
72 * | |
73 * This class is a big wrapper around sockets functions but portable, | |
74 * there is some functions that helps for getting error reporting. | |
75 */ | |
188
ce3e1c3d6fed
Update sockets to style and using instead of typedef
David Demelier <markand@malikania.fr>
parents:
175
diff
changeset
|
76 class Socket { |
170 | 77 public: |
78 #if defined(_WIN32) | |
188
ce3e1c3d6fed
Update sockets to style and using instead of typedef
David Demelier <markand@malikania.fr>
parents:
175
diff
changeset
|
79 using Type = SOCKET; |
ce3e1c3d6fed
Update sockets to style and using instead of typedef
David Demelier <markand@malikania.fr>
parents:
175
diff
changeset
|
80 using ConstArg = const char *; |
ce3e1c3d6fed
Update sockets to style and using instead of typedef
David Demelier <markand@malikania.fr>
parents:
175
diff
changeset
|
81 using Arg = char *; |
170 | 82 #else |
188
ce3e1c3d6fed
Update sockets to style and using instead of typedef
David Demelier <markand@malikania.fr>
parents:
175
diff
changeset
|
83 using Type = int; |
ce3e1c3d6fed
Update sockets to style and using instead of typedef
David Demelier <markand@malikania.fr>
parents:
175
diff
changeset
|
84 using ConstArg = const void *; |
ce3e1c3d6fed
Update sockets to style and using instead of typedef
David Demelier <markand@malikania.fr>
parents:
175
diff
changeset
|
85 using Arg = void *; |
170 | 86 #endif |
87 | |
175 | 88 private: |
170 | 89 Socket::Type m_socket; |
175 | 90 int m_domain; |
91 int m_type; | |
92 int m_protocol; | |
170 | 93 |
94 public: | |
95 /** | |
96 * To be called before any socket operation. | |
97 */ | |
98 static void init(); | |
99 | |
100 /** | |
101 * Get the last socket system error. | |
102 * | |
103 * @return a string message | |
104 */ | |
105 static std::string getLastSysError(); | |
106 | |
107 /** | |
108 * To be called before exiting. | |
109 */ | |
110 static void finish(); | |
111 | |
112 /** | |
113 * Default constructor. | |
114 */ | |
115 Socket(); | |
116 | |
117 /** | |
118 * Constructor to create a new socket. | |
119 * | |
120 * @param domain the domain | |
121 * @param type the type | |
173
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
122 * @param protocol the protocol |
170 | 123 * @throw SocketError on error |
124 */ | |
173
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
125 Socket(int domain, int type, int protocol); |
170 | 126 |
127 /** | |
128 * Get the socket. | |
129 * | |
130 * @return the socket | |
131 */ | |
132 Type getSocket() const; | |
133 | |
134 /** | |
175 | 135 * Get the domain. |
136 * | |
137 * @return the domain | |
138 */ | |
139 int getDomain() const; | |
140 | |
141 /** | |
142 * Get the type of socket. | |
143 * | |
144 * @return the type | |
145 */ | |
146 int getType() const; | |
147 | |
148 /** | |
149 * Get the protocol. | |
150 * | |
151 * @return the protocol | |
152 */ | |
153 int getProtocol() const; | |
154 | |
155 /** | |
170 | 156 * Set an option for the socket. |
157 * | |
158 * @param level the setting level | |
159 * @param name the name | |
160 * @param arg the value | |
161 * @param argLen the argument length | |
162 * @throw SocketError on error | |
163 */ | |
164 void set(int level, int name, const void *arg, unsigned argLen); | |
165 | |
166 /** | |
167 * Enable or disable blocking mode. | |
168 * | |
169 * @param block the mode | |
170 */ | |
171 void blockMode(bool block = true); | |
172 | |
173 /** | |
174 * Bind the socket. | |
175 * | |
176 * @param location a IP or Unix location | |
177 * @throw SocketError error | |
178 */ | |
179 void bind(const SocketAddress &address); | |
180 | |
181 /** | |
182 * Try to connect to the specific address | |
183 * | |
184 * @param addr the address | |
185 * @throw SocketError on error | |
186 */ | |
187 void connect(const SocketAddress &address); | |
188 | |
189 /** | |
190 * Accept a client without getting its info. | |
191 * | |
192 * @return a client ready to use | |
193 * @throw SocketError on error | |
194 */ | |
195 Socket accept(); | |
196 | |
197 /** | |
198 * Accept a client. | |
199 * | |
200 * @param info the optional client info | |
201 * @return a client ready to use | |
202 * @throw SocketError on error | |
203 */ | |
204 Socket accept(SocketAddress &info); | |
205 | |
206 /** | |
207 * Listen to a specific number of pending connections. | |
208 * | |
209 * @param max the max number of clients | |
210 * @throw SocketError on error | |
211 */ | |
212 void listen(int max); | |
213 | |
214 /** | |
215 * Receive some data. | |
216 * | |
217 * @param data the destination pointer | |
218 * @param dataLen max length to receive | |
219 * @return the number of bytes received | |
220 * @throw SocketError on error | |
221 */ | |
222 unsigned recv(void *data, unsigned dataLen); | |
223 | |
224 /** | |
225 * Send some data. | |
226 * | |
227 * @param data the data to send | |
228 * @param dataLen the data length | |
229 * @return the number of bytes sent | |
230 * @throw SocketError on error | |
231 */ | |
232 unsigned send(const void *data, unsigned dataLen); | |
233 | |
234 /** | |
235 * Send a message as a string. | |
236 * | |
237 * @param message the message | |
238 * @return the number of bytes sent | |
239 * @throw SocketError on error | |
240 */ | |
241 unsigned send(const std::string &message); | |
242 | |
243 /** | |
244 * Receive from a connection-less socket without getting | |
245 * client information. | |
246 * | |
247 * @param data the destination pointer | |
248 * @param dataLen max length to receive | |
249 * @return the number of bytes received | |
250 * @throw SocketError on error | |
251 */ | |
252 unsigned recvfrom(void *data, unsigned dataLen); | |
253 | |
254 /** | |
255 * Receive from a connection-less socket and get the client | |
256 * information. | |
257 * | |
258 * @param data the destination pointer | |
259 * @param dataLen max length to receive | |
260 * @param info the client info | |
261 * @return the number of bytes received | |
262 * @throw SocketError on error | |
263 */ | |
264 unsigned recvfrom(void *data, unsigned dataLen, SocketAddress &info); | |
265 | |
266 /** | |
267 * Send some data to a connection-less socket. | |
268 * | |
269 * @param data the data to send | |
270 * @param dataLen the data length | |
271 * @param address the address | |
272 * @return the number of bytes sent | |
273 * @throw SocketError on error | |
274 */ | |
275 unsigned sendto(const void *data, unsigned dataLen, const SocketAddress &info); | |
276 | |
277 /** | |
278 * Send a message to a connection-less socket. | |
279 * | |
280 * @param message the message | |
281 * @param address the address | |
282 * @return the number of bytes sent | |
283 * @throw SocketError on error | |
284 */ | |
285 unsigned sendto(const std::string &message, const SocketAddress &info); | |
286 | |
287 /** | |
288 * Close the socket. | |
289 */ | |
290 void close(); | |
291 }; | |
292 | |
293 bool operator==(const Socket &s1, const Socket &s2); | |
294 | |
174
9f22bd478f21
Add operator less because widely used
David Demelier <markand@malikania.fr>
parents:
173
diff
changeset
|
295 bool operator<(const Socket &s, const Socket &s2); |
9f22bd478f21
Add operator less because widely used
David Demelier <markand@malikania.fr>
parents:
173
diff
changeset
|
296 |
170 | 297 #endif // !_SOCKET_H_ |