Mercurial > hg > openttd
changeset 12188:225ef26f4d7c draft
(svn r16601) -Fix [FS#2880]: try 2... hopefully better this time
author | rubidium <rubidium@openttd.org> |
---|---|
date | Fri, 19 Jun 2009 20:26:18 +0000 |
parents | ab763acb06f6 |
children | 6684af314584 |
files | src/network/core/core.h src/network/core/tcp.cpp src/network/core/tcp.h src/network/core/tcp_game.cpp src/network/core/tcp_game.h src/network/core/udp.cpp src/network/core/udp.h src/network/network.cpp src/network/network_internal.h src/network/network_server.cpp |
diffstat | 10 files changed, 27 insertions(+), 31 deletions(-) [+] |
line wrap: on
line diff
--- a/src/network/core/core.h +++ b/src/network/core/core.h @@ -50,9 +50,10 @@ /** * Close the current connection; for TCP this will be mostly equivalent * to Close(), but for UDP it just means the packet has to be dropped. + * @param error Whether we quit under an error condition or not. * @return new status of the connection. */ - virtual NetworkRecvStatus CloseConnection() { this->has_quit = true; return NETWORK_RECV_STATUS_OKAY; } + virtual NetworkRecvStatus CloseConnection(bool error = true) { this->has_quit = true; return NETWORK_RECV_STATUS_OKAY; } /** * Whether the current client connected to the socket has quit.
--- a/src/network/core/tcp.cpp +++ b/src/network/core/tcp.cpp @@ -27,10 +27,10 @@ this->sock = INVALID_SOCKET; } -NetworkRecvStatus NetworkTCPSocketHandler::CloseConnection() +NetworkRecvStatus NetworkTCPSocketHandler::CloseConnection(bool error) { this->writable = false; - NetworkSocketHandler::CloseConnection(); + NetworkSocketHandler::CloseConnection(error); /* Free all pending and partially received packets */ while (this->packet_queue != NULL) {
--- a/src/network/core/tcp.h +++ b/src/network/core/tcp.h @@ -29,7 +29,7 @@ */ bool IsConnected() const { return this->sock != INVALID_SOCKET; } - virtual NetworkRecvStatus CloseConnection(); + virtual NetworkRecvStatus CloseConnection(bool error = true); void Send_Packet(Packet *packet); bool Send_Packets(); bool IsPacketQueueEmpty();
--- a/src/network/core/tcp_game.cpp +++ b/src/network/core/tcp_game.cpp @@ -50,7 +50,7 @@ * @return the new status * TODO: needs to be splitted when using client and server socket packets */ -NetworkRecvStatus NetworkClientSocket::CloseConnection() +NetworkRecvStatus NetworkClientSocket::CloseConnection(bool error) { /* Clients drop back to the main menu */ if (!_network_server && _networking) { @@ -62,7 +62,7 @@ return NETWORK_RECV_STATUS_CONN_LOST; } - NetworkCloseClient(this); + NetworkCloseClient(this, error); return NETWORK_RECV_STATUS_OKAY; }
--- a/src/network/core/tcp_game.h +++ b/src/network/core/tcp_game.h @@ -96,7 +96,7 @@ CommandPacket *command_queue; ///< The command-queue awaiting delivery - NetworkRecvStatus CloseConnection(); + NetworkRecvStatus CloseConnection(bool error = true); NetworkClientSocket(ClientID client_id = INVALID_CLIENT_ID); ~NetworkClientSocket();
--- a/src/network/core/udp.cpp +++ b/src/network/core/udp.cpp @@ -62,9 +62,9 @@ this->sockets.Clear(); } -NetworkRecvStatus NetworkUDPSocketHandler::CloseConnection() +NetworkRecvStatus NetworkUDPSocketHandler::CloseConnection(bool error) { - NetworkSocketHandler::CloseConnection(); + NetworkSocketHandler::CloseConnection(error); return NETWORK_RECV_STATUS_OKAY; }
--- a/src/network/core/udp.h +++ b/src/network/core/udp.h @@ -110,7 +110,7 @@ /** The opened sockets. */ SocketList sockets; - NetworkRecvStatus CloseConnection(); + NetworkRecvStatus CloseConnection(bool error = true); /* Declare all possible packets here. If it can be received by the * a specific handler, it has to be implemented. */
--- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -278,7 +278,7 @@ /* We just want to close the connection.. */ if (res == NETWORK_RECV_STATUS_CLOSE_QUERY) { cs->NetworkSocketHandler::CloseConnection(); - NetworkCloseClient(cs); + NetworkCloseClient(cs, true); _networking = false; DeleteWindowById(WC_NETWORK_STATUS_WINDOW, 0); @@ -291,6 +291,7 @@ case NETWORK_RECV_STATUS_NEWGRF_MISMATCH: errorno = NETWORK_ERROR_NEWGRF_MISMATCH; break; default: errorno = NETWORK_ERROR_GENERAL; break; } + /* This means we fucked up and the server closed the connection */ if (res != NETWORK_RECV_STATUS_SERVER_ERROR && res != NETWORK_RECV_STATUS_SERVER_FULL && res != NETWORK_RECV_STATUS_SERVER_BANNED) { @@ -298,7 +299,7 @@ } _switch_mode = SM_MENU; - NetworkCloseClient(cs); + NetworkCloseClient(cs, true); _networking = false; } @@ -437,7 +438,7 @@ } /* Close a connection */ -void NetworkCloseClient(NetworkClientSocket *cs) +void NetworkCloseClient(NetworkClientSocket *cs, bool error) { /* * Sending a message just before leaving the game calls cs->Send_Packets. @@ -448,9 +449,7 @@ */ if (cs->sock == INVALID_SOCKET) return; - DEBUG(net, 1, "Closed client connection %d", cs->client_id); - - if (!cs->HasClientQuit() && _network_server && cs->status > STATUS_INACTIVE) { + if (error && !cs->HasClientQuit() && _network_server && cs->status > STATUS_INACTIVE) { /* We did not receive a leave message from this client... */ char client_name[NETWORK_CLIENT_NAME_LENGTH]; NetworkClientSocket *new_cs; @@ -467,6 +466,8 @@ } } + DEBUG(net, 1, "Closed client connection %d", cs->client_id); + /* When the client was PRE_ACTIVE, the server was in pause mode, so unpause */ if (cs->status == STATUS_PRE_ACTIVE && (_pause_mode & PM_PAUSED_JOIN)) { DoCommandP(0, PM_PAUSED_JOIN, 0, CMD_PAUSE); @@ -579,7 +580,7 @@ SEND_COMMAND(PACKET_CLIENT_QUIT)(); cs->Send_Packets(); } - NetworkCloseClient(cs); + NetworkCloseClient(cs, false); } if (_network_server) {
--- a/src/network/network_internal.h +++ b/src/network/network_internal.h @@ -148,7 +148,7 @@ void NetworkFreeLocalCommandQueue(); /* from network.c */ -void NetworkCloseClient(NetworkClientSocket *cs); +void NetworkCloseClient(NetworkClientSocket *cs, bool error); void NetworkTextMessage(NetworkAction action, ConsoleColour colour, bool self_send, const char *name, const char *str = "", int64 data = 0); void NetworkGetClientName(char *clientname, size_t size, const NetworkClientSocket *cs); uint NetworkCalculateLag(const NetworkClientSocket *cs);
--- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -167,13 +167,13 @@ DEBUG(net, 1, "Client %d made an error and has been disconnected. Reason: '%s'", cs->client_id, str); } - cs->CloseConnection(); + cs->CloseConnection(false); /* Make sure the data get's there before we close the connection */ cs->Send_Packets(); /* The client made a mistake, so drop his connection now! */ - NetworkCloseClient(cs); + NetworkCloseClient(cs, false); } DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_CHECK_NEWGRFS)(NetworkClientSocket *cs) @@ -963,7 +963,7 @@ } } - cs->CloseConnection(); + cs->CloseConnection(false); } DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_QUIT) @@ -989,13 +989,7 @@ } } - /* First tell we already closed the connection... - * ... then start the generic code to close the actual connection. - * This to make sure the 'connection lost' message is only shown - * when the connection got really lost and not when the client - * told us it was going to disconnect. */ - cs->NetworkSocketHandler::CloseConnection(); - cs->CloseConnection(); + cs->CloseConnection(false); } DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_ACK) @@ -1610,7 +1604,7 @@ /* Client did still not report in after 4 game-day, drop him * (that is, the 3 of above, + 1 before any lag is counted) */ IConsolePrintF(CC_ERROR,"Client #%d is dropped because the client did not respond for more than 4 game-days", cs->client_id); - NetworkCloseClient(cs); + NetworkCloseClient(cs, true); continue; } @@ -1626,13 +1620,13 @@ int lag = NetworkCalculateLag(cs); if (lag > _settings_client.network.max_join_time) { IConsolePrintF(CC_ERROR,"Client #%d is dropped because it took longer than %d ticks for him to join", cs->client_id, _settings_client.network.max_join_time); - NetworkCloseClient(cs); + NetworkCloseClient(cs, true); } } else if (cs->status == STATUS_INACTIVE) { int lag = NetworkCalculateLag(cs); if (lag > 4 * DAY_TICKS) { IConsolePrintF(CC_ERROR,"Client #%d is dropped because it took longer than %d ticks to start the joining process", cs->client_id, 4 * DAY_TICKS); - NetworkCloseClient(cs); + NetworkCloseClient(cs, true); } }