diff options
author | rubidium <rubidium@openttd.org> | 2010-10-15 19:58:56 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2010-10-15 19:58:56 +0000 |
commit | 9858d699a3c39be2e3a547d59163178012365598 (patch) | |
tree | b0d10b23b4d41471d8ba846ca1805614acfec187 | |
parent | bda26d03b509c3783596c0b3431ca0c8fd7c9990 (diff) | |
download | openttd-9858d699a3c39be2e3a547d59163178012365598.tar.xz |
(svn r20935) -Codechange: only let the server side use a pool of connected sockets
-rw-r--r-- | src/network/core/tcp_game.cpp | 14 | ||||
-rw-r--r-- | src/network/core/tcp_game.h | 10 | ||||
-rw-r--r-- | src/network/network.cpp | 20 | ||||
-rw-r--r-- | src/network/network_client.h | 4 | ||||
-rw-r--r-- | src/network/network_command.cpp | 7 | ||||
-rw-r--r-- | src/network/network_internal.h | 2 | ||||
-rw-r--r-- | src/network/network_server.cpp | 8 | ||||
-rw-r--r-- | 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 037cb42fc..0960f4324 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 5ab814bae..71537179b 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<NetworkClientSocket, ClientIndex, 8, MAX_CLIENT_SLOTS> 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 ea6f4c37a..813d54ca9 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 d8884e037..b1edccae2 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 906db5862..ab752455e 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 e32b5122b..8b0dd8497 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 fa251cc81..c5d8979ee 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 2e878dc5f..d943b1fa0 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<NetworkClientSocket, ClientIndex, 8, MAX_CLIENT_SLOTS> 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 */ |