Mercurial > code
annotate C++/SocketListener.h @ 315:c9356cb38c86
Split sockets into SocketTcp and SocketUdp
author | David Demelier <markand@malikania.fr> |
---|---|
date | Mon, 02 Mar 2015 14:00:48 +0100 |
parents | c019f194475a |
children | 4c0af1143fc4 |
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 | |
19 #ifndef _SOCKET_LISTENER_H_ | |
20 #define _SOCKET_LISTENER_H_ | |
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 * |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
131 * 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
|
132 * 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
|
133 * SocketListener is destroyed. |
188
ce3e1c3d6fed
Update sockets to style and using instead of typedef
David Demelier <markand@malikania.fr>
parents:
170
diff
changeset
|
134 */ |
245
3c12f0e8bbb9
Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents:
194
diff
changeset
|
135 class SocketListener final { |
258 | 136 public: |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
137 #if defined(SOCKET_HAVE_POLL) |
270 | 138 static constexpr const SocketMethod PreferredMethod = SocketMethod::Poll; |
139 #else | |
140 static constexpr const SocketMethod PreferredMethod = SocketMethod::Select; | |
141 #endif | |
142 | |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
143 static const int Read; |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
144 static const int Write; |
258 | 145 |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
146 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
|
147 using Iface = std::unique_ptr<SocketListenerInterface>; |
258 | 148 |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
149 private: |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
150 Map m_map; |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
151 Iface m_interface; |
258 | 152 |
170 | 153 public: |
154 /** | |
271
f7000cc599d0
Socket: make listener movable
David Demelier <markand@malikania.fr>
parents:
270
diff
changeset
|
155 * Move constructor. |
f7000cc599d0
Socket: make listener movable
David Demelier <markand@malikania.fr>
parents:
270
diff
changeset
|
156 * |
f7000cc599d0
Socket: make listener movable
David Demelier <markand@malikania.fr>
parents:
270
diff
changeset
|
157 * @param other the other object |
f7000cc599d0
Socket: make listener movable
David Demelier <markand@malikania.fr>
parents:
270
diff
changeset
|
158 */ |
f7000cc599d0
Socket: make listener movable
David Demelier <markand@malikania.fr>
parents:
270
diff
changeset
|
159 SocketListener(SocketListener &&other) = default; |
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 /** |
f7000cc599d0
Socket: make listener movable
David Demelier <markand@malikania.fr>
parents:
270
diff
changeset
|
162 * Move operator. |
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 * @param other the other object |
f7000cc599d0
Socket: make listener movable
David Demelier <markand@malikania.fr>
parents:
270
diff
changeset
|
165 * @return this |
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 SocketListener &operator=(SocketListener &&other) = default; |
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 /** |
258 | 170 * Create a socket listener. |
245
3c12f0e8bbb9
Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents:
194
diff
changeset
|
171 * |
258 | 172 * @param method the preferred method |
245
3c12f0e8bbb9
Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents:
194
diff
changeset
|
173 */ |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
174 SocketListener(SocketMethod method = PreferredMethod); |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
175 |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
176 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
|
177 |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
178 inline auto begin() noexcept |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
179 { |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
180 return m_map.begin(); |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
181 } |
245
3c12f0e8bbb9
Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents:
194
diff
changeset
|
182 |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
183 inline auto begin() const noexcept |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
184 { |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
185 return m_map.begin(); |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
186 } |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
187 |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
188 inline auto cbegin() const noexcept |
258 | 189 { |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
190 return m_map.cbegin(); |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
191 } |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
192 |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
193 inline auto end() 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.end(); |
258 | 196 } |
170 | 197 |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
198 inline auto end() const noexcept |
258 | 199 { |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
200 return m_map.end(); |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
201 } |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
202 |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
203 inline auto cend() 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.cend(); |
258 | 206 } |
170 | 207 |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
208 void set(Socket &sc, int flags); |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
209 |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
210 void unset(Socket &sc, int flags) noexcept; |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
211 |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
212 inline void remove(Socket &sc) noexcept |
258 | 213 { |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
214 m_map.erase(sc); |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
215 m_interface->remove(sc); |
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 |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
218 inline void clear() noexcept |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
219 { |
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
220 m_map.clear(); |
258 | 221 m_interface->clear(); |
222 } | |
170 | 223 |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
224 unsigned size() const noexcept |
258 | 225 { |
315
c9356cb38c86
Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents:
303
diff
changeset
|
226 return m_map.size(); |
258 | 227 } |
194
9fc5f917872b
Update Luae bits and LuaSocket
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
228 |
9fc5f917872b
Update Luae bits and LuaSocket
David Demelier <markand@malikania.fr>
parents:
188
diff
changeset
|
229 /** |
258 | 230 * Select a socket. Waits for a specific amount of time specified as the duration. |
170 | 231 * |
270 | 232 * @param duration the duration |
247 | 233 * @return the socket ready |
170 | 234 * @throw SocketError on error |
235 * @throw SocketTimeout on timeout | |
236 */ | |
258 | 237 template <typename Rep, typename Ratio> |
238 inline SocketStatus select(const std::chrono::duration<Rep, Ratio> &duration) | |
239 { | |
240 auto cvt = std::chrono::duration_cast<std::chrono::milliseconds>(duration); | |
241 | |
242 return m_interface->select(cvt.count()); | |
243 } | |
244 | |
245 /** | |
297
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
278
diff
changeset
|
246 * Overload with milliseconds. |
258 | 247 * |
297
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
278
diff
changeset
|
248 * @param timeout the optional timeout in milliseconds |
258 | 249 * @return the socket ready |
250 * @throw SocketError on error | |
251 * @throw SocketTimeout on timeout | |
252 */ | |
297
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
278
diff
changeset
|
253 inline SocketStatus select(int timeout = -1) |
258 | 254 { |
297
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
278
diff
changeset
|
255 return m_interface->select(timeout); |
258 | 256 } |
257 | |
258 /** | |
270 | 259 * Select multiple sockets. |
260 * | |
261 * @param duration the duration | |
262 * @return the socket ready | |
263 * @throw SocketError on error | |
264 * @throw SocketTimeout on timeout | |
265 */ | |
266 template <typename Rep, typename Ratio> | |
267 inline std::vector<SocketStatus> selectMultiple(const std::chrono::duration<Rep, Ratio> &duration) | |
268 { | |
269 auto cvt = std::chrono::duration_cast<std::chrono::milliseconds>(duration); | |
270 | |
271 return m_interface->selectMultiple(cvt.count()); | |
272 } | |
273 | |
274 /** | |
297
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
278
diff
changeset
|
275 * Overload with milliseconds. |
270 | 276 * |
277 * @return the socket ready | |
278 * @throw SocketError on error | |
279 * @throw SocketTimeout on timeout | |
280 */ | |
297
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
278
diff
changeset
|
281 inline std::vector<SocketStatus> selectMultiple(int timeout = -1) |
270 | 282 { |
297
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
278
diff
changeset
|
283 return m_interface->selectMultiple(timeout); |
270 | 284 } |
170 | 285 }; |
286 | |
287 #endif // !_SOCKET_LISTENER_H_ |