@@ -45,6 +45,7 @@ LibWebsocketServer::LibWebsocketServer()
4545 m_wsi(nullptr ),
4646 m_retry_policy(),
4747 m_protocols(),
48+ m_connecting_ip_address(nullptr ),
4849 m_clients()
4950{
5051}
@@ -278,18 +279,33 @@ int LibWebsocketServer::eventCallback(struct lws* wsi, enum lws_callback_reasons
278279 struct lws_filter_network_conn_args * filter = reinterpret_cast <struct lws_filter_network_conn_args *>(user);
279280
280281 // Get client IP address
281- char ip_address[64 ];
282- lws_sa46_write_numeric_address (reinterpret_cast <lws_sockaddr46*>(&filter->cli_addr ), ip_address, sizeof (ip_address));
282+ // => Save the current IP address so it can be retrieved
283+ // in the LWS_CALLBACK_WSI_CREATE calls which happens
284+ // during the same event loop processing
285+ server->m_connecting_ip_address = new char [64u ];
286+ lws_sa46_write_numeric_address (reinterpret_cast <lws_sockaddr46*>(&filter->cli_addr ), server->m_connecting_ip_address , 64u );
283287
284288 // Notify user
285- if (!server->m_listener ->wsAcceptConnection (ip_address ))
289+ if (!server->m_listener ->wsAcceptConnection (server-> m_connecting_ip_address ))
286290 {
287291 // Disconnect
288292 ret = -1 ;
293+
294+ // Release memory
295+ delete[] server->m_connecting_ip_address ;
289296 }
290297 }
291298 break ;
292299
300+ case LWS_CALLBACK_WSI_CREATE:
301+ {
302+ // Set client IP address
303+ // => Must be done here to ensure that the event loop is still working
304+ // with the same client as in the LWS_CALLBACK_FILTER_NETWORK_CONNECTION call
305+ lws_set_wsi_user (wsi, server->m_connecting_ip_address );
306+ }
307+ break ;
308+
293309 case LWS_CALLBACK_HTTP_CONFIRM_UPGRADE:
294310 {
295311 // Check selected protocol
@@ -418,8 +434,7 @@ int LibWebsocketServer::eventCallback(struct lws* wsi, enum lws_callback_reasons
418434 case LWS_CALLBACK_ESTABLISHED:
419435 {
420436 // Get client IP address
421- char ip_address[64 ];
422- lws_get_peer_simple (wsi, ip_address, sizeof (ip_address));
437+ char * ip_address = reinterpret_cast <char *>(lws_wsi_user (wsi));
423438
424439 // Instanciate a new client
425440 std::shared_ptr<IClient> client (new Client (wsi, ip_address));
@@ -455,21 +470,30 @@ int LibWebsocketServer::eventCallback(struct lws* wsi, enum lws_callback_reasons
455470 {
456471 client->m_listener ->wsClientDisconnected ();
457472 }
473+ }
474+ }
475+ break ;
476+
477+ case LWS_CALLBACK_WSI_DESTROY:
478+ {
479+ // Get client IP address
480+ char * ip_address = reinterpret_cast <char *>(lws_wsi_user (wsi));
458481
482+ // Get corresponding client
483+ auto iter_client = server->m_clients .find (wsi);
484+ if (iter_client != server->m_clients .end ())
485+ {
459486 // Remove client
460487 server->m_clients .erase (iter_client);
461488 }
462489 else
463490 {
464491 // Connection failed to be established
465-
466- // Get client IP address
467- char ip_address[64 ];
468- lws_get_peer_simple (wsi, ip_address, sizeof (ip_address));
469-
470- // Notify event
471492 server->m_listener ->wsClientFailedToConnect (ip_address);
472493 }
494+
495+ // Release memory
496+ delete[] ip_address;
473497 }
474498 break ;
475499
0 commit comments