Changed message handling in TcpServer

This commit is contained in:
xX-TheDoctor-Xx
2016-08-11 17:57:21 +01:00
parent 37d71de3c0
commit bcf8ea1919
3 changed files with 14 additions and 14 deletions

View File

@ -25,7 +25,7 @@ public:
uint16 AllocateID(); uint16 AllocateID();
void AddToClientsList(TcpClient &client); 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 AcceptConnections();
void SendMessage(const NetworkMessage &message); void SendMessage(const NetworkMessage &message);
@ -40,8 +40,8 @@ public:
std::function<void(const NetworkMessage &message)> OnMessage; std::function<void(const NetworkMessage &message)> OnMessage;
private: private:
static void process_client_messages(TcpServer *server, TcpClient &client);
static void process_message(TcpServer *server, const NetworkMessage &message); static void process_message(TcpServer *server, const NetworkMessage &message);
static void process_client_received_data(TcpServer *server);
static void accept_connections(TcpServer *server); static void accept_connections(TcpServer *server);
bool initialize(uint16 port = default_server_port); bool initialize(uint16 port = default_server_port);

View File

@ -78,7 +78,7 @@ void TcpClient::Shutdown()
message.distribution_mode = Server; message.distribution_mode = Server;
message.tag = DISCONNECT; message.tag = DISCONNECT;
SendMessage(message); SendMessage(message);
uint16 code = shutdown(tcp_socket, SD_BOTH); uint16 code = closesocket(tcp_socket);
if (code == SOCKET_ERROR) if (code == SOCKET_ERROR)
{ {
if (Config::GetUsingConsole()) if (Config::GetUsingConsole())
@ -156,7 +156,7 @@ const NetworkBuffer &TcpClient::receive_data_array()
uint16 temp; uint16 temp;
if (DataAvailable(temp) && temp > 0) if (DataAvailable(temp) && temp > 0)
{ {
if (!recv(tcp_socket, reinterpret_cast<char*>(buffer.header.data()), 4, 0)) if (recv(tcp_socket, reinterpret_cast<char*>(buffer.header.data()), 4, 0) == 4)
//invalid header //invalid header
return NetworkBuffer(); return NetworkBuffer();
} }

View File

@ -75,6 +75,7 @@ void TcpServer::Shutdown()
{ {
TcpClient client = *it; TcpClient client = *it;
client.Shutdown(); client.Shutdown();
clients.erase(std::find(clients.begin(), clients.end(), client));
} }
} }
@ -103,7 +104,6 @@ void TcpServer::AcceptConnections()
void TcpServer::accept_connections(TcpServer *server) void TcpServer::accept_connections(TcpServer *server)
{ {
std::async(std::launch::async, &process_client_received_data, server);
while (server->running) while (server->running)
{ {
SOCKET client_socket = accept(server->server_tcp_socket, 0, 0); SOCKET client_socket = accept(server->server_tcp_socket, 0, 0);
@ -117,20 +117,20 @@ void TcpServer::accept_connections(TcpServer *server)
break; 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<TcpClient>::iterator it = server->clients.begin(); it != server->clients.end(); ++it)
{
TcpClient client = *it;
NetworkMessage message(client.ReceiveMessage()); 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 if (message.valid)
} server->SendMessage(message);
} }
} }