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) |  | ||||||
| 		{ |  | ||||||
| 			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); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 xX-TheDoctor-Xx
					xX-TheDoctor-Xx