From 66087c5e60f651ddae2e1c36b650ddcfdfd1ac49 Mon Sep 17 00:00:00 2001 From: rubidium Date: Fri, 15 Oct 2010 19:58:56 +0000 Subject: [PATCH] (svn r20935) -Codechange: only let the server side use a pool of connected sockets --- src/network/core/tcp_game.cpp | 14 +++----------- src/network/core/tcp_game.h | 10 +--------- src/network/network.cpp | 20 +++++++++----------- src/network/network_client.h | 4 +++- src/network/network_command.cpp | 7 ++++--- src/network/network_internal.h | 2 ++ src/network/network_server.cpp | 8 ++++++++ src/network/network_server.h | 10 +++++++++- 8 files changed, 39 insertions(+), 36 deletions(-) diff --git a/src/network/core/tcp_game.cpp b/src/network/core/tcp_game.cpp index 037cb42fce..0960f43241 100644 --- a/src/network/core/tcp_game.cpp +++ b/src/network/core/tcp_game.cpp @@ -17,18 +17,10 @@ #include "../network.h" #include "../network_internal.h" -#include "../../core/pool_func.hpp" #include "../../debug.h" #include "table/strings.h" -/** Make very sure the preconditions given in network_type.h are actually followed */ -assert_compile(MAX_CLIENT_SLOTS > MAX_CLIENTS); -assert_compile(NetworkClientSocketPool::MAX_SIZE == MAX_CLIENT_SLOTS); - -NetworkClientSocketPool _networkclientsocket_pool("NetworkClientSocket"); -INSTANTIATE_POOL_METHODS(NetworkClientSocket) - /** * Create a new socket for the game connection. * @param s The socket to connect with. @@ -75,7 +67,7 @@ NetworkRecvStatus NetworkGameSocketHandler::CloseConnection(bool error) * @param p the packet to handle * @return #NetworkRecvStatus of handling. */ -NetworkRecvStatus NetworkClientSocket::HandlePacket(Packet *p) +NetworkRecvStatus NetworkGameSocketHandler::HandlePacket(Packet *p) { PacketGameType type = (PacketGameType)p->Recv_uint8(); @@ -140,7 +132,7 @@ NetworkRecvStatus NetworkClientSocket::HandlePacket(Packet *p) * HandlePacket is returned. * @return #NetworkRecvStatus of the last handled packet. */ -NetworkRecvStatus NetworkClientSocket::Recv_Packets() +NetworkRecvStatus NetworkGameSocketHandler::Recv_Packets() { Packet *p; while ((p = this->Recv_Packet()) != NULL) { @@ -158,7 +150,7 @@ NetworkRecvStatus NetworkClientSocket::Recv_Packets() * @param type the packet type to create the stub for */ #define DEFINE_UNAVAILABLE_GAME_RECEIVE_COMMAND(type) \ -NetworkRecvStatus NetworkClientSocket::NetworkPacketReceive_## type ##_command(Packet *p) \ +NetworkRecvStatus NetworkGameSocketHandler::NetworkPacketReceive_## type ##_command(Packet *p) \ { \ DEBUG(net, 0, "[tcp/game] received illegal packet type %d from client %d", \ type, this->client_id); \ diff --git a/src/network/core/tcp_game.h b/src/network/core/tcp_game.h index 5ab814baea..71537179b4 100644 --- a/src/network/core/tcp_game.h +++ b/src/network/core/tcp_game.h @@ -108,16 +108,11 @@ enum ClientStatus { STATUS_END ///< Must ALWAYS be on the end of this list!! (period) }; -class NetworkGameSocketHandler; -typedef NetworkGameSocketHandler NetworkClientSocket; -typedef Pool NetworkClientSocketPool; -extern NetworkClientSocketPool _networkclientsocket_pool; - #define DECLARE_GAME_RECEIVE_COMMAND(type) virtual NetworkRecvStatus NetworkPacketReceive_## type ##_command(Packet *p) #define DEF_GAME_RECEIVE_COMMAND(cls, type) NetworkRecvStatus cls ##NetworkGameSocketHandler::NetworkPacketReceive_ ## type ## _command(Packet *p) /** Base socket handler for all TCP sockets */ -class NetworkGameSocketHandler : public NetworkClientSocketPool::PoolItem<&_networkclientsocket_pool>, public NetworkTCPSocketHandler { +class NetworkGameSocketHandler : public NetworkTCPSocketHandler { /* TODO: rewrite into a proper class */ private: NetworkClientInfo *info; ///< Client info related to this socket @@ -191,9 +186,6 @@ public: void Send_Command(Packet *p, const CommandPacket *cp); }; -#define FOR_ALL_CLIENT_SOCKETS_FROM(var, start) FOR_ALL_ITEMS_FROM(NetworkClientSocket, clientsocket_index, var, start) -#define FOR_ALL_CLIENT_SOCKETS(var) FOR_ALL_CLIENT_SOCKETS_FROM(var, 0) - #endif /* ENABLE_NETWORK */ #endif /* NETWORK_CORE_TCP_GAME_H */ diff --git a/src/network/network.cpp b/src/network/network.cpp index ea6f4c37a7..813d54ca93 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -514,25 +514,23 @@ static void InitializeNetworkPools() } /* Close all current connections */ -static void NetworkClose() +void NetworkClose() { - NetworkClientSocket *cs; - - FOR_ALL_CLIENT_SOCKETS(cs) { - if (!_network_server) { - MyClient::SendQuit(); - cs->Send_Packets(); - } - cs->CloseConnection(NETWORK_RECV_STATUS_CONN_LOST); - } - if (_network_server) { + NetworkClientSocket *cs; + FOR_ALL_CLIENT_SOCKETS(cs) { + cs->CloseConnection(NETWORK_RECV_STATUS_CONN_LOST); + } /* We are a server, also close the listensocket */ for (SocketList::iterator s = _listensockets.Begin(); s != _listensockets.End(); s++) { closesocket(s->second); } _listensockets.Clear(); DEBUG(net, 1, "[tcp] closed listeners"); + } else if (MyClient::my_client != NULL) { + MyClient::SendQuit(); + MyClient::my_client->Send_Packets(); + MyClient::my_client->CloseConnection(NETWORK_RECV_STATUS_CONN_LOST); } TCPConnecter::KillAll(); diff --git a/src/network/network_client.h b/src/network/network_client.h index d8884e0379..b1edccae23 100644 --- a/src/network/network_client.h +++ b/src/network/network_client.h @@ -17,8 +17,10 @@ #include "network_internal.h" /** Class for handling the client side of the game connection. */ -class ClientNetworkGameSocketHandler : public NetworkGameSocketHandler { +class ClientNetworkGameSocketHandler : public ZeroedMemoryAllocator, public NetworkGameSocketHandler { protected: + friend void NetworkExecuteLocalCommandQueue(); + friend void NetworkClose(); static ClientNetworkGameSocketHandler *my_client; DECLARE_GAME_RECEIVE_COMMAND(PACKET_SERVER_FULL); diff --git a/src/network/network_command.cpp b/src/network/network_command.cpp index 906db58620..ab752455ed 100644 --- a/src/network/network_command.cpp +++ b/src/network/network_command.cpp @@ -14,6 +14,7 @@ #include "../stdafx.h" #include "../debug.h" #include "network_client.h" +#include "network_server.h" #include "network.h" #include "../command_func.h" #include "../company_func.h" @@ -179,7 +180,7 @@ void NetworkExecuteLocalCommandQueue() { assert(IsLocalCompany()); - CommandQueue &queue = (_network_server ? _local_execution_queue : NetworkClientSocket::Get(0)->incoming_queue); + CommandQueue &queue = (_network_server ? _local_execution_queue : ClientNetworkGameSocketHandler::my_client->incoming_queue); CommandPacket *cp; while ((cp = queue.Peek()) != NULL) { @@ -274,7 +275,7 @@ void NetworkDistributeCommands() * @param cp the struct to write the data to. * @return an error message. When NULL there has been no error. */ -const char *NetworkClientSocket::Recv_Command(Packet *p, CommandPacket *cp) +const char *NetworkGameSocketHandler::Recv_Command(Packet *p, CommandPacket *cp) { cp->company = (CompanyID)p->Recv_uint8(); cp->cmd = p->Recv_uint32(); @@ -299,7 +300,7 @@ const char *NetworkClientSocket::Recv_Command(Packet *p, CommandPacket *cp) * @param p the packet to send it in. * @param cp the packet to actually send. */ -void NetworkClientSocket::Send_Command(Packet *p, const CommandPacket *cp) +void NetworkGameSocketHandler::Send_Command(Packet *p, const CommandPacket *cp) { p->Send_uint8 (cp->company); p->Send_uint32(cp->cmd); diff --git a/src/network/network_internal.h b/src/network/network_internal.h index e32b5122bd..8b0dd84979 100644 --- a/src/network/network_internal.h +++ b/src/network/network_internal.h @@ -50,6 +50,8 @@ extern bool _ddc_fastforward; #define _ddc_fastforward (false) #endif /* DEBUG_DUMP_COMMANDS */ +typedef class ServerNetworkGameSocketHandler NetworkClientSocket; + enum MapPacket { MAP_PACKET_START, MAP_PACKET_NORMAL, diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index fa251cc81b..c5d8979eeb 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -31,6 +31,7 @@ #include "../window_func.h" #include "../roadveh.h" #include "../order_backup.h" +#include "../core/pool_func.hpp" #include "../rev.h" #include "table/strings.h" @@ -41,6 +42,13 @@ DECLARE_POSTFIX_INCREMENT(ClientID) /** The identifier counter for new clients (is never decreased) */ static ClientID _network_client_id = CLIENT_ID_FIRST; +/** Make very sure the preconditions given in network_type.h are actually followed */ +assert_compile(MAX_CLIENT_SLOTS > MAX_CLIENTS); +assert_compile(NetworkClientSocketPool::MAX_SIZE == MAX_CLIENT_SLOTS); + +NetworkClientSocketPool _networkclientsocket_pool("NetworkClientSocket"); +INSTANTIATE_POOL_METHODS(NetworkClientSocket) + /** * Create a new socket for the server side of the game connection. * @param s The socket to connect with. diff --git a/src/network/network_server.h b/src/network/network_server.h index 2e878dc5f1..d943b1fa03 100644 --- a/src/network/network_server.h +++ b/src/network/network_server.h @@ -16,8 +16,13 @@ #include "network_internal.h" +class ServerNetworkGameSocketHandler; +typedef ServerNetworkGameSocketHandler NetworkClientSocket; +typedef Pool NetworkClientSocketPool; +extern NetworkClientSocketPool _networkclientsocket_pool; + /** Class for handling the server side of the game connection. */ -class ServerNetworkGameSocketHandler : public NetworkGameSocketHandler { +class ServerNetworkGameSocketHandler : public NetworkClientSocketPool::PoolItem<&_networkclientsocket_pool>, public NetworkGameSocketHandler { protected: DECLARE_GAME_RECEIVE_COMMAND(PACKET_CLIENT_JOIN); DECLARE_GAME_RECEIVE_COMMAND(PACKET_CLIENT_COMPANY_INFO); @@ -54,6 +59,9 @@ DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_MOVE)(NetworkClientSocket *cs, uint1 void NetworkServer_ReadPackets(NetworkClientSocket *cs); void NetworkServer_Tick(bool send_frame); +#define FOR_ALL_CLIENT_SOCKETS_FROM(var, start) FOR_ALL_ITEMS_FROM(NetworkClientSocket, clientsocket_index, var, start) +#define FOR_ALL_CLIENT_SOCKETS(var) FOR_ALL_CLIENT_SOCKETS_FROM(var, 0) + #else /* ENABLE_NETWORK */ /* Network function stubs when networking is disabled */