diff options
author | rubidium <rubidium@openttd.org> | 2007-03-06 22:00:42 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2007-03-06 22:00:42 +0000 |
commit | 4b75a297660a7504573dfa3c168905a3ca81470c (patch) | |
tree | a90b27beb2d4d1de059a5cdb393a6be2250d9dda /src/network | |
parent | 6b329f2728a11867bcbf09319106552f61422597 (diff) | |
download | openttd-4b75a297660a7504573dfa3c168905a3ca81470c.tar.xz |
(svn r9038) -Fix [FS#115]: inactive connections are not automatically kicked, i.e. people who only open a telnet (or similar) connection to a server.
Diffstat (limited to 'src/network')
-rw-r--r-- | src/network/core/tcp.h | 1 | ||||
-rw-r--r-- | src/network/network_server.cpp | 11 |
2 files changed, 12 insertions, 0 deletions
diff --git a/src/network/core/tcp.h b/src/network/core/tcp.h index 27df6e03d..a667ab099 100644 --- a/src/network/core/tcp.h +++ b/src/network/core/tcp.h @@ -73,6 +73,7 @@ typedef struct CommandPacket { /** Status of a client */ typedef enum { STATUS_INACTIVE, ///< The client is not connected nor active + STATUS_AUTHORIZING,///< The client is authorizing STATUS_AUTH, ///< The client is authorized STATUS_MAP_WAIT, ///< The client is waiting as someone else is downloading the map STATUS_MAP, ///< The client is downloading the map diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index ce9b9f881..5762550c9 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -214,6 +214,11 @@ DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_NEED_PASSWORD)(NetworkTCPSocketHandl // uint8: Type of password // + /* Invalid packet when status is AUTH or higher */ + if (cs->status >= STATUS_AUTH) return; + + cs->status = STATUS_AUTHORIZING; + Packet *p = NetworkSend_Init(PACKET_SERVER_NEED_PASSWORD); p->Send_uint8(type); cs->Send_Packet(p); @@ -1533,6 +1538,12 @@ void NetworkServer_Tick(bool send_frame) IConsolePrintF(_icolour_err,"Client #%d is dropped because it took longer than %d ticks for him to join", cs->index, _network_max_join_time); NetworkCloseClient(cs); } + } else if (cs->status == STATUS_INACTIVE) { + int lag = NetworkCalculateLag(cs); + if (lag > 4 * DAY_TICKS) { + IConsolePrintF(_icolour_err,"Client #%d is dropped because it took longer than %d ticks to start the joining process", cs->index, 4 * DAY_TICKS); + NetworkCloseClient(cs); + } } if (cs->status >= STATUS_PRE_ACTIVE) { |