diff --git a/include/TcpServer.hpp b/include/TcpServer.hpp index 2fc313a..b5263b1 100644 --- a/include/TcpServer.hpp +++ b/include/TcpServer.hpp @@ -25,7 +25,7 @@ public: uint16 AllocateID(); void AddToClientsList(TcpClient &client); - bool StartServer(bool accept_connections); + bool StartServer(bool accept_connections); // if accept_connections is false the user must call the funcion AcceptConnections() void AcceptConnections(); void SendMessage(const NetworkMessage &message); @@ -40,8 +40,8 @@ public: std::function OnMessage; private: + static void process_client_messages(TcpServer *server, TcpClient &client); static void process_message(TcpServer *server, const NetworkMessage &message); - static void process_client_received_data(TcpServer *server); static void accept_connections(TcpServer *server); bool initialize(uint16 port = default_server_port); diff --git a/src/TcpClientWindows.cpp b/src/TcpClientWindows.cpp index 02a9351..057cf76 100644 --- a/src/TcpClientWindows.cpp +++ b/src/TcpClientWindows.cpp @@ -78,7 +78,7 @@ void TcpClient::Shutdown() message.distribution_mode = Server; message.tag = DISCONNECT; SendMessage(message); - uint16 code = shutdown(tcp_socket, SD_BOTH); + uint16 code = closesocket(tcp_socket); if (code == SOCKET_ERROR) { if (Config::GetUsingConsole()) @@ -156,7 +156,7 @@ const NetworkBuffer &TcpClient::receive_data_array() uint16 temp; if (DataAvailable(temp) && temp > 0) { - if (!recv(tcp_socket, reinterpret_cast(buffer.header.data()), 4, 0)) + if (recv(tcp_socket, reinterpret_cast(buffer.header.data()), 4, 0) == 4) //invalid header return NetworkBuffer(); } diff --git a/src/TcpServerWindows.cpp b/src/TcpServerWindows.cpp index 39ddf53..322fe2d 100644 --- a/src/TcpServerWindows.cpp +++ b/src/TcpServerWindows.cpp @@ -75,6 +75,7 @@ void TcpServer::Shutdown() { TcpClient client = *it; client.Shutdown(); + clients.erase(std::find(clients.begin(), clients.end(), client)); } } @@ -103,7 +104,6 @@ void TcpServer::AcceptConnections() void TcpServer::accept_connections(TcpServer *server) { - std::async(std::launch::async, &process_client_received_data, server); while (server->running) { SOCKET client_socket = accept(server->server_tcp_socket, 0, 0); @@ -117,20 +117,20 @@ void TcpServer::accept_connections(TcpServer *server) break; } - server->AddToClientsList(TcpClient(client_socket)); + TcpClient client(client_socket); + server->AddToClientsList(client); + + std::async(std::launch::async, &process_client_messages, server, client); } } -void TcpServer::process_client_received_data(TcpServer *server) +void TcpServer::process_client_messages(TcpServer *server, TcpClient & client) { - while (server->running) // we only process the data if we are receiving connections, + while (server->running) { - for (std::vector::iterator it = server->clients.begin(); it != server->clients.end(); ++it) - { - TcpClient client = *it; - NetworkMessage message(client.ReceiveMessage()); - std::async(std::launch::async, &process_message, server, message); // we start an async task so that we dont bottleneck the receiver - } + NetworkMessage message(client.ReceiveMessage()); + if (message.valid) + server->SendMessage(message); } }