annotate C++/SocketListener.h @ 277:b544a599e08e

Socket: remove enum class
author David Demelier <markand@malikania.fr>
date Thu, 23 Oct 2014 17:59:14 +0200
parents f7000cc599d0
children adcae2bde2f0
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
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
22 #include <chrono>
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
23 #include <functional>
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
24 #include <vector>
170
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 #include "Socket.h"
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
27
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
28 #if defined(_WIN32)
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
29 # if _WIN32_WINNT >= 0x0600
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
30 # define SOCKET_LISTENER_HAVE_POLL
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
31 # endif
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
32 #else
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
33 # define SOCKET_LISTENER_HAVE_POLL
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
34 #endif
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
35
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 /**
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
37 * @enum SocketDirection
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
38 * @brief The SocketDirection enum
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
39 *
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
40 * Bitmask that can be set to both reading and writing.
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 */
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 271
diff changeset
42 enum SocketDirection {
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
43 Read = (1 << 0), //!< only for receive
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
44 Write = (1 << 1) //!< only for sending
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
45 };
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
46
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
47 /**
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
48 * @enum SocketMethod
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
49 * @brief The SocketMethod enum
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
50 *
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
51 * Select the method of polling. It is only a preferred method, for example if you
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
52 * request for poll but it is not available, select will be used.
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
53 */
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 271
diff changeset
54 enum SocketMethod {
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
55 Select, //!< select(2) method, fallback
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
56 Poll //!< poll(2), everywhere possible
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
57 };
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
58
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
59 /**
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
60 * @struct SocketStatus
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
61 * @brief The SocketStatus struct
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
62 *
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
63 * Result of a select call, returns the first ready socket found with its
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
64 * direction.
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
65 */
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
66 struct SocketStatus {
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 271
diff changeset
67 Socket socket; //!< which socket is ready
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 271
diff changeset
68 int direction; //!< the direction
170
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
188
ce3e1c3d6fed Update sockets to style and using instead of typedef
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
71 /**
ce3e1c3d6fed Update sockets to style and using instead of typedef
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
72 * @class SocketListener
ce3e1c3d6fed Update sockets to style and using instead of typedef
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
73 * @brief Synchronous multiplexing
ce3e1c3d6fed Update sockets to style and using instead of typedef
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
74 *
ce3e1c3d6fed Update sockets to style and using instead of typedef
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
75 * 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
76 */
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
77 class SocketListener final {
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
78 public:
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
79 /**
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
80 * @brief Function for listing all sockets
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
81 */
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 271
diff changeset
82 using MapFunc = std::function<void (Socket &, int)>;
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
83
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
84 #if defined(SOCKET_LISTENER_HAVE_POLL)
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
85 static constexpr const SocketMethod PreferredMethod = SocketMethod::Poll;
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
86 #else
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
87 static constexpr const SocketMethod PreferredMethod = SocketMethod::Select;
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
88 #endif
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
89
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
90 /**
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
91 * @class Interface
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
92 * @brief Implement the polling method
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
93 */
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
94 class Interface {
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
95 public:
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
96 /**
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
97 * Default destructor.
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
98 */
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
99 virtual ~Interface() = default;
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
100
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
101 /**
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
102 * List all sockets in the interface.
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
103 *
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
104 * @param func the function
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
105 */
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
106 virtual void list(const MapFunc &func) = 0;
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
107
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
108 /**
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
109 * Add a socket with a specified direction.
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
110 *
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
111 * @param s the socket
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
112 * @param direction the direction
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
113 */
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 271
diff changeset
114 virtual void add(Socket s, int direction) = 0;
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
115
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
116 /**
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
117 * Remove a socket with a specified direction.
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
118 *
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
119 * @param s the socket
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
120 * @param direction the direction
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
121 */
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 271
diff changeset
122 virtual void remove(const Socket &s, int direction) = 0;
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
123
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
124 /**
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
125 * Remove all sockets.
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
126 */
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
127 virtual void clear() = 0;
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
128
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
129 /**
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
130 * Get the total number of sockets in the listener.
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
131 */
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
132 virtual unsigned size() const = 0;
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
133
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
134 /**
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
135 * Select one socket.
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
136 *
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
137 * @param ms the number of milliseconds to wait, -1 means forever
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
138 * @return the socket status
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
139 * @throw error::Failure on failure
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
140 * @throw error::Timeout on timeout
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
141 */
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
142 virtual SocketStatus select(int ms) = 0;
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
143
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
144 /**
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
145 * Select many sockets.
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
146 *
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
147 * @param ms the number of milliseconds to wait, -1 means forever
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
148 * @return a vector of ready sockets
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
149 * @throw error::Failure on failure
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
150 * @throw error::Timeout on timeout
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
151 */
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
152 virtual std::vector<SocketStatus> selectMultiple(int ms) = 0;
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
153 };
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
154
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
155 std::unique_ptr<Interface> m_interface;
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
156
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 public:
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 /**
271
f7000cc599d0 Socket: make listener movable
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
159 * Move constructor.
f7000cc599d0 Socket: make listener movable
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
160 *
f7000cc599d0 Socket: make listener movable
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
161 * @param other the other object
f7000cc599d0 Socket: make listener movable
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
162 */
f7000cc599d0 Socket: make listener movable
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
163 SocketListener(SocketListener &&other) = default;
f7000cc599d0 Socket: make listener movable
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
164
f7000cc599d0 Socket: make listener movable
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
165 /**
f7000cc599d0 Socket: make listener movable
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
166 * Move operator.
f7000cc599d0 Socket: make listener movable
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
167 *
f7000cc599d0 Socket: make listener movable
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
168 * @param other the other object
f7000cc599d0 Socket: make listener movable
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
169 * @return this
f7000cc599d0 Socket: make listener movable
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
170 */
f7000cc599d0 Socket: make listener movable
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
171 SocketListener &operator=(SocketListener &&other) = default;
f7000cc599d0 Socket: make listener movable
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
172
f7000cc599d0 Socket: make listener movable
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
173 /**
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
174 * Create a socket listener.
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
175 *
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
176 * @param method the preferred method
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
177 */
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 271
diff changeset
178 SocketListener(int method = Poll);
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
179
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 194
diff changeset
180 /**
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 * Add a socket to listen to.
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 *
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 * @param s the socket
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
184 * @param direction the direction
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
185 */
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 271
diff changeset
186 inline void add(Socket s, int direction)
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
187 {
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
188 m_interface->add(std::move(s), direction);
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
189 }
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
190
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
191 /**
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
192 * Remove a socket from the list.
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
193 *
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
194 * @param s the socket
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
195 * @param direction the direction
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
196 */
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 271
diff changeset
197 inline void remove(const Socket &s, int direction)
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
198 {
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
199 m_interface->remove(s, direction);
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
200 }
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
201
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
202 /**
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
203 * Remove every sockets in the listener.
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
204 */
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
205 inline void clear()
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
206 {
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
207 m_interface->clear();
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
208 }
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
209
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
210 /**
194
9fc5f917872b Update Luae bits and LuaSocket
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
211 * Get the number of clients in listener.
9fc5f917872b Update Luae bits and LuaSocket
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
212 *
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
213 * @return the total number of sockets in the listener
194
9fc5f917872b Update Luae bits and LuaSocket
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
214 */
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
215 inline unsigned size() const
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
216 {
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
217 return m_interface->size();
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
218 }
194
9fc5f917872b Update Luae bits and LuaSocket
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
219
9fc5f917872b Update Luae bits and LuaSocket
David Demelier <markand@malikania.fr>
parents: 188
diff changeset
220 /**
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
221 * Select a socket. Waits for a specific amount of time specified as the duration.
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
222 *
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
223 * @param duration the duration
247
806dbb6011c7 Socket:
David Demelier <markand@malikania.fr>
parents: 245
diff changeset
224 * @return the socket ready
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
225 * @throw SocketError on error
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
226 * @throw SocketTimeout on timeout
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 */
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
228 template <typename Rep, typename Ratio>
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
229 inline SocketStatus select(const std::chrono::duration<Rep, Ratio> &duration)
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
230 {
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
231 auto cvt = std::chrono::duration_cast<std::chrono::milliseconds>(duration);
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
232
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
233 return m_interface->select(cvt.count());
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
234 }
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
235
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
236 /**
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
237 * Overload that waits indefinitely.
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
238 *
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
239 * @return the socket ready
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
240 * @throw SocketError on error
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
241 * @throw SocketTimeout on timeout
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
242 */
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
243 inline SocketStatus select()
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
244 {
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
245 return m_interface->select(-1);
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
246 }
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
247
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
248 /**
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
249 * Select multiple sockets.
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
250 *
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
251 * @param duration the duration
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
252 * @return the socket ready
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
253 * @throw SocketError on error
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
254 * @throw SocketTimeout on timeout
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
255 */
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
256 template <typename Rep, typename Ratio>
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
257 inline std::vector<SocketStatus> selectMultiple(const std::chrono::duration<Rep, Ratio> &duration)
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
258 {
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
259 auto cvt = std::chrono::duration_cast<std::chrono::milliseconds>(duration);
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
260
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
261 return m_interface->selectMultiple(cvt.count());
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
262 }
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
263
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
264 /**
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
265 * Overload that waits indefinitely.
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
266 *
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
267 * @return the socket ready
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
268 * @throw SocketError on error
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
269 * @throw SocketTimeout on timeout
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
270 */
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
271 inline std::vector<SocketStatus> selectMultiple()
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
272 {
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
273 return m_interface->selectMultiple(-1);
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
274 }
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
275
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
276 /**
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
277 * List every socket in the listener.
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
278 *
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
279 * @param func the function to call
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
280 */
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
281 template <typename Func>
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
282 inline void list(Func func)
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
283 {
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
284 m_interface->list(func);
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
285 }
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
286 };
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
287
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
288 #endif // !_SOCKET_LISTENER_H_