Mercurial > code
annotate C++/modules/Socket/SocketListener.h @ 334:0b576ee64d45
* Create brand new hierarchy
* Rename DynLib to Dynlib
* Remove some warnings
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sun, 08 Mar 2015 14:26:33 +0100 |
parents | C++/SocketListener.h@cba77da58496 |
children | d235553e47a9 |
rev | line source |
---|---|
170 | 1 /* |
2 * SocketListener.h -- portable select() wrapper | |
3 * | |
299 | 4 * Copyright (c) 2013, 2014 David Demelier <markand@malikania.fr> |
170 | 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 | |
319 | 19 #ifndef _SOCKET_LISTENER_NG_H_ |
20 #define _SOCKET_LISTENER_NG_H_ | |
170 | 21 |
258 | 22 #include <chrono> |
23 #include <functional> | |
278
adcae2bde2f0
Socket: listener now have initializer list constructor
David Demelier <markand@malikania.fr>
parents:
277
diff
changeset
|
24 #include <initializer_list> |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
25 #include <map> |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
26 #include <memory> |
278
adcae2bde2f0
Socket: listener now have initializer list constructor
David Demelier <markand@malikania.fr>
parents:
277
diff
changeset
|
27 #include <utility> |
270 | 28 #include <vector> |
170 | 29 |
30 #include "Socket.h" | |
31 | |
270 | 32 #if defined(_WIN32) |
33 # if _WIN32_WINNT >= 0x0600 | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
34 # define SOCKET_HAVE_POLL |
270 | 35 # endif |
36 #else | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
37 # define SOCKET_HAVE_POLL |
270 | 38 #endif |
39 | |
170 | 40 /** |
258 | 41 * @enum SocketMethod |
42 * @brief The SocketMethod enum | |
43 * | |
44 * Select the method of polling. It is only a preferred method, for example if you | |
45 * request for poll but it is not available, select will be used. | |
46 */ | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
47 enum class SocketMethod { |
258 | 48 Select, //!< select(2) method, fallback |
49 Poll //!< poll(2), everywhere possible | |
50 }; | |
51 | |
52 /** | |
53 * @struct SocketStatus | |
54 * @brief The SocketStatus struct | |
55 * | |
56 * Result of a select call, returns the first ready socket found with its | |
57 * direction. | |
58 */ | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
59 class SocketStatus { |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
60 public: |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
61 Socket &socket; //!< which socket is ready |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
62 int direction; //!< the direction |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
63 }; |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
64 |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
65 /** |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
66 * @class SocketListenerInterface |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
67 * @brief Implement the polling method |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
68 */ |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
69 class SocketListenerInterface { |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
70 public: |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
71 /** |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
72 * Default destructor. |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
73 */ |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
74 virtual ~SocketListenerInterface() = default; |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
75 |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
76 /** |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
77 * Add a socket with a specified direction. |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
78 * |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
79 * @param s the socket |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
80 * @param direction the direction |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
81 */ |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
82 virtual void set(Socket &sc, int direction) = 0; |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
83 |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
84 /** |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
85 * Remove a socket with a specified direction. |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
86 * |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
87 * @param s the socket |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
88 * @param direction the direction |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
89 */ |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
90 virtual void unset(Socket &sc, int direction) = 0; |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
91 |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
92 /** |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
93 * Remove completely a socket. |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
94 * |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
95 * @param sc the socket to remove |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
96 */ |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
97 virtual void remove(Socket &sc) = 0; |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
98 |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
99 /** |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
100 * Remove all sockets. |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
101 */ |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
102 virtual void clear() = 0; |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
103 |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
104 /** |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
105 * Select one socket. |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
106 * |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
107 * @param ms the number of milliseconds to wait, -1 means forever |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
108 * @return the socket status |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
109 * @throw error::Failure on failure |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
110 * @throw error::Timeout on timeout |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
111 */ |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
112 virtual SocketStatus select(int ms) = 0; |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
113 |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
114 /** |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
115 * Select many sockets. |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
116 * |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
117 * @param ms the number of milliseconds to wait, -1 means forever |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
118 * @return a vector of ready sockets |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
119 * @throw error::Failure on failure |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
120 * @throw error::Timeout on timeout |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
121 */ |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
122 virtual std::vector<SocketStatus> selectMultiple(int ms) = 0; |
170 | 123 }; |
124 | |
188
ce3e1c3d6fed
Update sockets to style and using instead of typedef
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
125 /** |
ce3e1c3d6fed
Update sockets to style and using instead of typedef
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
126 * @class SocketListener |
ce3e1c3d6fed
Update sockets to style and using instead of typedef
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
127 * @brief Synchronous multiplexing |
ce3e1c3d6fed
Update sockets to style and using instead of typedef
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
128 * |
ce3e1c3d6fed
Update sockets to style and using instead of typedef
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
129 * Convenient wrapper around the select() system call. |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
130 * |
319 | 131 * This class is implemented using a bridge pattern to allow different uses |
132 * of listener implementation. | |
133 * | |
134 * Currently, poll and select() are available. | |
135 * | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
136 * This wrappers takes abstract sockets as non-const reference but it does not |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
137 * own them so you must take care that sockets are still alive until the |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
138 * SocketListener is destroyed. |
188
ce3e1c3d6fed
Update sockets to style and using instead of typedef
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
139 */ |
245
3c12f0e8bbb9
Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents:
194
diff
changeset
|
140 class SocketListener final { |
258 | 141 public: |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
142 #if defined(SOCKET_HAVE_POLL) |
270 | 143 static constexpr const SocketMethod PreferredMethod = SocketMethod::Poll; |
144 #else | |
145 static constexpr const SocketMethod PreferredMethod = SocketMethod::Select; | |
146 #endif | |
147 | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
148 static const int Read; |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
149 static const int Write; |
258 | 150 |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
151 using Map = std::map<std::reference_wrapper<Socket>, int>; |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
152 using Iface = std::unique_ptr<SocketListenerInterface>; |
258 | 153 |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
154 private: |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
155 Map m_map; |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
156 Iface m_interface; |
258 | 157 |
170 | 158 public: |
159 /** | |
271
f7000cc599d0
Socket: make listener movable
David Demelier <markand@malikania.fr>
parents:
270
diff
changeset
|
160 * Move constructor. |
f7000cc599d0
Socket: make listener movable
David Demelier <markand@malikania.fr>
parents:
270
diff
changeset
|
161 * |
f7000cc599d0
Socket: make listener movable
David Demelier <markand@malikania.fr>
parents:
270
diff
changeset
|
162 * @param other the other object |
f7000cc599d0
Socket: make listener movable
David Demelier <markand@malikania.fr>
parents:
270
diff
changeset
|
163 */ |
f7000cc599d0
Socket: make listener movable
David Demelier <markand@malikania.fr>
parents:
270
diff
changeset
|
164 SocketListener(SocketListener &&other) = default; |
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 /** |
f7000cc599d0
Socket: make listener movable
David Demelier <markand@malikania.fr>
parents:
270
diff
changeset
|
167 * Move operator. |
f7000cc599d0
Socket: make listener movable
David Demelier <markand@malikania.fr>
parents:
270
diff
changeset
|
168 * |
f7000cc599d0
Socket: make listener movable
David Demelier <markand@malikania.fr>
parents:
270
diff
changeset
|
169 * @param other the other object |
f7000cc599d0
Socket: make listener movable
David Demelier <markand@malikania.fr>
parents:
270
diff
changeset
|
170 * @return this |
f7000cc599d0
Socket: make listener movable
David Demelier <markand@malikania.fr>
parents:
270
diff
changeset
|
171 */ |
f7000cc599d0
Socket: make listener movable
David Demelier <markand@malikania.fr>
parents:
270
diff
changeset
|
172 SocketListener &operator=(SocketListener &&other) = default; |
f7000cc599d0
Socket: make listener movable
David Demelier <markand@malikania.fr>
parents:
270
diff
changeset
|
173 |
f7000cc599d0
Socket: make listener movable
David Demelier <markand@malikania.fr>
parents:
270
diff
changeset
|
174 /** |
258 | 175 * Create a socket listener. |
245
3c12f0e8bbb9
Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents:
194
diff
changeset
|
176 * |
258 | 177 * @param method the preferred method |
245
3c12f0e8bbb9
Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents:
194
diff
changeset
|
178 */ |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
179 SocketListener(SocketMethod method = PreferredMethod); |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
180 |
319 | 181 /** |
182 * Create a listener from a list of sockets. | |
183 * | |
184 * @param list the list | |
185 */ | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
186 SocketListener(std::initializer_list<std::pair<std::reference_wrapper<Socket>, int>> list); |
278
adcae2bde2f0
Socket: listener now have initializer list constructor
David Demelier <markand@malikania.fr>
parents:
277
diff
changeset
|
187 |
319 | 188 /** |
189 * Return an iterator to the beginning. | |
190 * | |
191 * @return the iterator | |
192 */ | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
193 inline auto begin() noexcept |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
194 { |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
195 return m_map.begin(); |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
196 } |
245
3c12f0e8bbb9
Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents:
194
diff
changeset
|
197 |
319 | 198 /** |
199 * Overloaded function. | |
200 * | |
201 * @return the iterator | |
202 */ | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
203 inline auto begin() const noexcept |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
204 { |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
205 return m_map.begin(); |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
206 } |
316
4c0af1143fc4
Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents:
315
diff
changeset
|
207 |
319 | 208 /** |
209 * Overloaded function. | |
210 * | |
211 * @return the iterator | |
212 */ | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
213 inline auto cbegin() const noexcept |
258 | 214 { |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
215 return m_map.cbegin(); |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
216 } |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
217 |
319 | 218 /** |
219 * Return an iterator to the end. | |
220 * | |
221 * @return the iterator | |
222 */ | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
223 inline auto end() noexcept |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
224 { |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
225 return m_map.end(); |
258 | 226 } |
170 | 227 |
319 | 228 /** |
229 * Overloaded function. | |
230 * | |
231 * @return the iterator | |
232 */ | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
233 inline auto end() const noexcept |
258 | 234 { |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
235 return m_map.end(); |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
236 } |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
237 |
319 | 238 /** |
239 * Overloaded function. | |
240 * | |
241 * @return the iterator | |
242 */ | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
243 inline auto cend() const noexcept |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
244 { |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
245 return m_map.cend(); |
258 | 246 } |
170 | 247 |
319 | 248 /** |
249 * Add a socket to the listener. | |
250 * | |
251 * @param sc the socket | |
252 * @param direction (may be OR'ed) | |
253 */ | |
254 void set(Socket &sc, int direction); | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
255 |
319 | 256 /** |
257 * Unset a socket from the listener, only the direction is removed | |
258 * unless the two directions are requested. | |
259 * | |
260 * For example, if you added a socket for both reading and writing, | |
261 * unsetting the write direction will keep the socket for reading. | |
262 * | |
263 * @param sc the socket | |
264 * @param direction the direction (may be OR'ed) | |
265 * @see remove | |
266 */ | |
267 void unset(Socket &sc, int direction) noexcept; | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
268 |
319 | 269 /** |
270 * Remove completely the socket from the listener. | |
271 * | |
272 * @param sc the socket | |
273 */ | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
274 inline void remove(Socket &sc) noexcept |
258 | 275 { |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
276 m_map.erase(sc); |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
277 m_interface->remove(sc); |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
278 } |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
279 |
319 | 280 /** |
281 * Remove all sockets. | |
282 */ | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
283 inline void clear() noexcept |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
284 { |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
285 m_map.clear(); |
258 | 286 m_interface->clear(); |
287 } | |
170 | 288 |
319 | 289 /** |
290 * Get the number of sockets in the listener. | |
291 */ | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
292 unsigned size() const noexcept |
258 | 293 { |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
294 return m_map.size(); |
258 | 295 } |
194
9fc5f917872b
Update Luae bits and LuaSocket
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
296 |
9fc5f917872b
Update Luae bits and LuaSocket
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
297 /** |
258 | 298 * Select a socket. Waits for a specific amount of time specified as the duration. |
170 | 299 * |
270 | 300 * @param duration the duration |
247 | 301 * @return the socket ready |
170 | 302 */ |
258 | 303 template <typename Rep, typename Ratio> |
304 inline SocketStatus select(const std::chrono::duration<Rep, Ratio> &duration) | |
305 { | |
306 auto cvt = std::chrono::duration_cast<std::chrono::milliseconds>(duration); | |
307 | |
308 return m_interface->select(cvt.count()); | |
309 } | |
310 | |
311 /** | |
297
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
278
diff
changeset
|
312 * Overload with milliseconds. |
258 | 313 * |
297
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
278
diff
changeset
|
314 * @param timeout the optional timeout in milliseconds |
258 | 315 * @return the socket ready |
316 */ | |
297
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
278
diff
changeset
|
317 inline SocketStatus select(int timeout = -1) |
258 | 318 { |
297
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
278
diff
changeset
|
319 return m_interface->select(timeout); |
258 | 320 } |
321 | |
322 /** | |
270 | 323 * Select multiple sockets. |
324 * | |
325 * @param duration the duration | |
326 * @return the socket ready | |
327 */ | |
328 template <typename Rep, typename Ratio> | |
329 inline std::vector<SocketStatus> selectMultiple(const std::chrono::duration<Rep, Ratio> &duration) | |
330 { | |
331 auto cvt = std::chrono::duration_cast<std::chrono::milliseconds>(duration); | |
332 | |
333 return m_interface->selectMultiple(cvt.count()); | |
334 } | |
335 | |
336 /** | |
297
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
278
diff
changeset
|
337 * Overload with milliseconds. |
270 | 338 * |
339 * @return the socket ready | |
340 */ | |
297
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
278
diff
changeset
|
341 inline std::vector<SocketStatus> selectMultiple(int timeout = -1) |
270 | 342 { |
297
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
278
diff
changeset
|
343 return m_interface->selectMultiple(timeout); |
270 | 344 } |
170 | 345 }; |
346 | |
319 | 347 #endif // !_SOCKET_LISTENER_NG_H_ |