99#include < iostream>
1010#include < map>
1111#include < mutex>
12+ #include < array>
1213#include < optional>
1314#include < thread>
1415#include < utility>
@@ -69,6 +70,13 @@ namespace netlib {
6970 FD_SET (fd, &fdset);
7071 }
7172 }
73+
74+ // windows returns WSAEINVAL if we have nothing to pass to select, so we
75+ // need to filter this previously and elmulate the sleeping
76+ if (!highest_fd) {
77+ std::this_thread::sleep_for (std::chrono::milliseconds (50 ));
78+ continue ;
79+ }
7280 // we want the timeout to be fairly low, so that we avoid situations where
7381 // we have a new client in _clients, but are not monitoring it yet - that
7482 // would mean we have a "hardcoded" delay in servicing a new clients packets
@@ -119,14 +127,14 @@ namespace netlib {
119127 std::this_thread::sleep_for (std::chrono::milliseconds (10 ));
120128 new_endpoint.addr_len = sizeof (addrinfo);
121129 socket_t status = ::accept (_listener_sock->get_raw ().value (), &new_endpoint.addr , &new_endpoint.addr_len );
122- if (status > 0 ) {
130+ if (status != INVALID_SOCKET ) {
123131 new_endpoint.socket .set_raw (status);
124132 new_endpoint.socket .set_nonblocking (true );
125133 if (_cb_onconnect) {
126134 netlib::server_response greeting = _cb_onconnect (new_endpoint);
127135 if (!greeting.answer .empty ()) {
128136 ssize_t send_result = ::send (new_endpoint.socket .get_raw ().value (),
129- greeting.answer .data (),
137+ reinterpret_cast < const char *>( greeting.answer .data () ),
130138 greeting.answer .size (),
131139 0 );
132140 if ((send_result != greeting.answer .size ()) && (_cb_on_error)) {
@@ -159,7 +167,7 @@ namespace netlib {
159167 ssize_t recv_res = 0 ;
160168 while (true ) {
161169 recv_res = ::recv (endpoint.socket .get_raw ().value (),
162- buffer.data (), buffer.size (), 0 );
170+ reinterpret_cast < char *>( buffer.data () ), buffer.size (), 0 );
163171 if (recv_res > 0 ) {
164172 total_buffer.insert (total_buffer.end (), buffer.begin (),
165173 buffer.begin () + recv_res);
@@ -180,7 +188,7 @@ namespace netlib {
180188 if (!response.answer .empty ()) {
181189 ssize_t send_result = ::send (
182190 endpoint.socket .get_raw ().value (),
183- response.answer .data (), response.answer .size (), 0 );
191+ reinterpret_cast < const char *>( response.answer .data () ), response.answer .size (), 0 );
184192 if (send_result != response.answer .size ()) {
185193 return socket_get_last_error ();
186194 }
@@ -217,7 +225,9 @@ namespace netlib {
217225 }
218226
219227 public:
220- server () = default ;
228+ server () {
229+ netlib::socket::initialize_system ();
230+ }
221231 virtual ~server () { stop ();
222232 }
223233 inline std::error_condition create (const std::string& bind_host,
0 commit comments