annotate C++/SocketListener.h @ 245:3c12f0e8bbb9

Converter: add cstring missing Sockets: * Starts a PIMPL idiom to safely cast Socket with the future SocketSsl and be able to return a class of type "Socket" whilst the interface returns effectively a SocketSsl. * Rename some function to be more cute to use like getDomain -> domain(). * SocketListener now owns completely sockets and must be moved to it, the dedicated function select() always return a socket owned by SocketListener. * Operation close is not needed anymore but the function stays in case it's needed.
author David Demelier <markand@malikania.fr>
date Sun, 28 Sep 2014 21:15:26 +0200
parents 9fc5f917872b
children 806dbb6011c7
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 * SocketListener.h -- portable select() wrapper
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_LISTENER_H_
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #define _SOCKET_LISTENER_H_
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
21
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <vector>
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
23
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include "Socket.h"
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
25
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 /**
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 * @class SocketTimeout
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 * @brief thrown when a timeout occured
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 */
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
30 class SocketTimeout final : public std::exception {
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 public:
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
32 const char *what() const noexcept override;
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 };
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
34
188
ce3e1c3d6fed Update sockets to style and using instead of typedef
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
35 /**
ce3e1c3d6fed Update sockets to style and using instead of typedef
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
36 * @class SocketListener
ce3e1c3d6fed Update sockets to style and using instead of typedef
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
37 * @brief Synchronous multiplexing
ce3e1c3d6fed Update sockets to style and using instead of typedef
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
38 *
ce3e1c3d6fed Update sockets to style and using instead of typedef
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
39 * Convenient wrapper around the select() system call.
ce3e1c3d6fed Update sockets to style and using instead of typedef
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
40 */
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
41 class SocketListener final {
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 private:
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
43 std::vector<Socket> m_sockets;
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
44
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 public:
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 /**
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
47 * Create a socket listener with a specific number of sockets to reserve.
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
48 *
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
49 * @param count the number of socket to reserve (default: 0)
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
50 */
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
51 SocketListener(int count = 0);
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
52
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
53 /**
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 * Add a socket to listen to.
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 *
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 * @param s the socket
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 */
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
58 void add(Socket &&s);
170
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 * Remove a socket from the list.
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 *
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 * @param s the socket
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 */
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
65 void remove(const Socket &s);
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
66
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 * Remove every sockets in the listener.
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 void clear();
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 /**
194
9fc5f917872b Update Luae bits and LuaSocket
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
73 * Get the number of clients in listener.
9fc5f917872b Update Luae bits and LuaSocket
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
74 *
9fc5f917872b Update Luae bits and LuaSocket
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
75 * @return the number of clients in the listener.
9fc5f917872b Update Luae bits and LuaSocket
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
76 */
9fc5f917872b Update Luae bits and LuaSocket
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
77 unsigned size();
9fc5f917872b Update Luae bits and LuaSocket
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
78
9fc5f917872b Update Luae bits and LuaSocket
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
79 /**
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 * Wait for an event in the socket list. If both s and us are set to 0 then
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 * it waits indefinitely.
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 *
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
83 * Taking ownership of the returned socket is undefined behaviour.
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
84 *
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 * @param s the timeout in seconds
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 * @param us the timeout in milliseconds
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
87 * @see take
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
88 * @return the socket ready owner by the SocketListener
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 * @throw SocketError on error
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 * @throw SocketTimeout on timeout
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 */
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 Socket &select(int s = 0, int us = 0);
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
93
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
94 /**
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
95 * Take back all sockets that listener own.
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
96 *
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
97 * @param func the function to call (void f(Socket &&s))
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
98 */
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
99 template <typename Func>
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
100 void take(Func func)
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
101 {
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
102 for (auto &x : m_sockets)
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
103 func(std::move(x));
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
104
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
105 clear();
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
106 }
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 };
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
108
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 #endif // !_SOCKET_LISTENER_H_