Mercurial > code
annotate C++/Socket.h @ 173:18ad49172e6c
Update documentation and add Unix sockets
author | David Demelier <markand@malikania.fr> |
---|---|
date | Thu, 12 Sep 2013 11:23:08 +0200 |
parents | fd138f2a9773 |
children | 9f22bd478f21 |
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 | |
90 protected: | |
91 Socket::Type m_socket; | |
92 | |
93 public: | |
94 /** | |
95 * To be called before any socket operation. | |
96 */ | |
97 static void init(); | |
98 | |
99 /** | |
100 * Get the last socket system error. | |
101 * | |
102 * @return a string message | |
103 */ | |
104 static std::string getLastSysError(); | |
105 | |
106 /** | |
107 * To be called before exiting. | |
108 */ | |
109 static void finish(); | |
110 | |
111 /** | |
112 * Default constructor. | |
113 */ | |
114 Socket(); | |
115 | |
116 /** | |
117 * Constructor to create a new socket. | |
118 * | |
119 * @param domain the domain | |
120 * @param type the type | |
173
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
121 * @param protocol the protocol |
170 | 122 * @throw SocketError on error |
123 */ | |
173
18ad49172e6c
Update documentation and add Unix sockets
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
124 Socket(int domain, int type, int protocol); |
170 | 125 |
126 /** | |
127 * Constructor with a socket already opened. | |
128 * | |
129 * @param sock the socket | |
130 */ | |
131 Socket(Socket::Type sock); | |
132 | |
133 /** | |
134 * Default destructor. | |
135 */ | |
136 virtual ~Socket(); | |
137 | |
138 /** | |
139 * Get the socket. | |
140 * | |
141 * @return the socket | |
142 */ | |
143 Type getSocket() const; | |
144 | |
145 /** | |
146 * Set an option for the socket. | |
147 * | |
148 * @param level the setting level | |
149 * @param name the name | |
150 * @param arg the value | |
151 * @param argLen the argument length | |
152 * @throw SocketError on error | |
153 */ | |
154 void set(int level, int name, const void *arg, unsigned argLen); | |
155 | |
156 /** | |
157 * Enable or disable blocking mode. | |
158 * | |
159 * @param block the mode | |
160 */ | |
161 void blockMode(bool block = true); | |
162 | |
163 /** | |
164 * Bind the socket. | |
165 * | |
166 * @param location a IP or Unix location | |
167 * @throw SocketError error | |
168 */ | |
169 void bind(const SocketAddress &address); | |
170 | |
171 /** | |
172 * Try to connect to the specific address | |
173 * | |
174 * @param addr the address | |
175 * @throw SocketError on error | |
176 */ | |
177 void connect(const SocketAddress &address); | |
178 | |
179 /** | |
180 * Accept a client without getting its info. | |
181 * | |
182 * @return a client ready to use | |
183 * @throw SocketError on error | |
184 */ | |
185 Socket accept(); | |
186 | |
187 /** | |
188 * Accept a client. | |
189 * | |
190 * @param info the optional client info | |
191 * @return a client ready to use | |
192 * @throw SocketError on error | |
193 */ | |
194 Socket accept(SocketAddress &info); | |
195 | |
196 /** | |
197 * Listen to a specific number of pending connections. | |
198 * | |
199 * @param max the max number of clients | |
200 * @throw SocketError on error | |
201 */ | |
202 void listen(int max); | |
203 | |
204 /** | |
205 * Receive some data. | |
206 * | |
207 * @param data the destination pointer | |
208 * @param dataLen max length to receive | |
209 * @return the number of bytes received | |
210 * @throw SocketError on error | |
211 */ | |
212 unsigned recv(void *data, unsigned dataLen); | |
213 | |
214 /** | |
215 * Send some data. | |
216 * | |
217 * @param data the data to send | |
218 * @param dataLen the data length | |
219 * @return the number of bytes sent | |
220 * @throw SocketError on error | |
221 */ | |
222 unsigned send(const void *data, unsigned dataLen); | |
223 | |
224 /** | |
225 * Send a message as a string. | |
226 * | |
227 * @param message the message | |
228 * @return the number of bytes sent | |
229 * @throw SocketError on error | |
230 */ | |
231 unsigned send(const std::string &message); | |
232 | |
233 /** | |
234 * Receive from a connection-less socket without getting | |
235 * client information. | |
236 * | |
237 * @param data the destination pointer | |
238 * @param dataLen max length to receive | |
239 * @return the number of bytes received | |
240 * @throw SocketError on error | |
241 */ | |
242 unsigned recvfrom(void *data, unsigned dataLen); | |
243 | |
244 /** | |
245 * Receive from a connection-less socket and get the client | |
246 * information. | |
247 * | |
248 * @param data the destination pointer | |
249 * @param dataLen max length to receive | |
250 * @param info the client info | |
251 * @return the number of bytes received | |
252 * @throw SocketError on error | |
253 */ | |
254 unsigned recvfrom(void *data, unsigned dataLen, SocketAddress &info); | |
255 | |
256 /** | |
257 * Send some data to a connection-less socket. | |
258 * | |
259 * @param data the data to send | |
260 * @param dataLen the data length | |
261 * @param address the address | |
262 * @return the number of bytes sent | |
263 * @throw SocketError on error | |
264 */ | |
265 unsigned sendto(const void *data, unsigned dataLen, const SocketAddress &info); | |
266 | |
267 /** | |
268 * Send a message to a connection-less socket. | |
269 * | |
270 * @param message the message | |
271 * @param address the address | |
272 * @return the number of bytes sent | |
273 * @throw SocketError on error | |
274 */ | |
275 unsigned sendto(const std::string &message, const SocketAddress &info); | |
276 | |
277 /** | |
278 * Close the socket. | |
279 */ | |
280 void close(); | |
281 }; | |
282 | |
283 bool operator==(const Socket &s1, const Socket &s2); | |
284 | |
285 #endif // !_SOCKET_H_ |