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