annotate C++/SocketListener.h @ 258:4ad3c85ab73e

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