changeset 16530:1d7075a58158 draft

(svn r21256) -Fix [FS#4189]: Clients weren't always notified when the connection was lost
author rubidium <rubidium@openttd.org>
date Fri, 19 Nov 2010 15:55:53 +0000
parents cdd66123fcf6
children ffad6d958e85
files src/lang/english.txt src/network/network_client.cpp src/network/network_client.h
diffstat 3 files changed, 40 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/lang/english.txt
+++ b/src/lang/english.txt
@@ -1788,6 +1788,9 @@
 STR_NETWORK_ERROR_CLIENT_TOO_MANY_COMMANDS                      :was sending too many commands
 ############ End of leave-in-this-order
 
+STR_NETWORK_ERROR_CLIENT_GUI_LOST_CONNECTION_CAPTION            :{WHITE}Possible connection loss
+STR_NETWORK_ERROR_CLIENT_GUI_LOST_CONNECTION                    :{WHITE}The last {NUM} second{P "" s} no data has arrived from the server
+
 # Network related errors
 STR_NETWORK_SERVER_MESSAGE                                      :*** {1:RAW_STRING}
 ############ Leave those lines in this order!!
--- a/src/network/network_client.cpp
+++ b/src/network/network_client.cpp
@@ -27,6 +27,7 @@
 #include "../company_gui.h"
 #include "../core/random_func.hpp"
 #include "../date_func.h"
+#include "../gui.h"
 #include "../rev.h"
 #include "network.h"
 #include "network_base.h"
@@ -140,6 +141,7 @@
 /*static */ void ClientNetworkGameSocketHandler::Send()
 {
 	my_client->Send_Packets();
+	my_client->CheckConnection();
 }
 
 /**
@@ -1032,6 +1034,40 @@
 	return NETWORK_RECV_STATUS_OKAY;
 }
 
+/**
+ * Check the connection's state, i.e. is the connection still up?
+ */
+void ClientNetworkGameSocketHandler::CheckConnection()
+{
+	/* Only once we're authorized we can expect a steady stream of packets. */
+	if (this->status < STATUS_AUTHORIZED) return;
+
+	/* It might... sometimes occur that the realtime ticker overflows. */
+	if (_realtime_tick < this->last_packet) this->last_packet = _realtime_tick;
+
+	/* Lag is in milliseconds; 2 seconds are roughly the server's
+	 * "you're slow" threshold (1 game day). */
+	uint lag = (_realtime_tick - this->last_packet) / 1000;
+	if (lag < 2) return;
+
+	/* 10 seconds are (way) more than 4 game days after which
+	 * the server will forcefully disconnect you. */
+	if (lag > 10) {
+		this->NetworkGameSocketHandler::CloseConnection();
+		_switch_mode_errorstr = STR_NETWORK_ERROR_LOSTCONNECTION;
+		return;
+	}
+
+	/* Prevent showing the lag message every tick; just update it when needed. */
+	static uint last_lag = 0;
+	if (last_lag == lag) return;
+
+	last_lag = lag;
+	SetDParam(0, lag);
+	ShowErrorMessage(STR_NETWORK_ERROR_CLIENT_GUI_LOST_CONNECTION_CAPTION, STR_NETWORK_ERROR_CLIENT_GUI_LOST_CONNECTION, WL_INFO);
+}
+
+
 /* Is called after a client is connected to the server */
 void NetworkClient_Connected()
 {
--- a/src/network/network_client.h
+++ b/src/network/network_client.h
@@ -73,6 +73,7 @@
 	static NetworkRecvStatus SendNewGRFsOk();
 	static NetworkRecvStatus SendGetMap();
 	static NetworkRecvStatus SendMapOk();
+	void CheckConnection();
 public:
 	ClientNetworkGameSocketHandler(SOCKET s);
 	~ClientNetworkGameSocketHandler();