Changed message handling in TcpServer
This commit is contained in:
@ -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);
|
||||||
|
|
||||||
|
|||||||
@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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)
|
NetworkMessage message(client.ReceiveMessage());
|
||||||
{
|
if (message.valid)
|
||||||
TcpClient client = *it;
|
server->SendMessage(message);
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user