summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2013-07-13 09:26:11 +0000
committerrubidium <rubidium@openttd.org>2013-07-13 09:26:11 +0000
commit5eac3a77d20c3a838203bd261b05601fa0c7b6ee (patch)
treee28365da85a6103365d043717c56e2d1da088b37
parent8f89cd6dd3dff7c36c6080de03b4ffc102f1b771 (diff)
downloadopenttd-5eac3a77d20c3a838203bd261b05601fa0c7b6ee.tar.xz
(svn r25597) -Fix [FS#5635]: [Content] When the server closed the connection, the client would for eternity try to read a packet and never timeout making it impossible to reconnect
-rw-r--r--src/network/core/tcp_content.cpp10
-rw-r--r--src/network/core/tcp_content.h2
-rw-r--r--src/network/network_content.cpp6
3 files changed, 12 insertions, 6 deletions
diff --git a/src/network/core/tcp_content.cpp b/src/network/core/tcp_content.cpp
index ecef92a4f..8a4604feb 100644
--- a/src/network/core/tcp_content.cpp
+++ b/src/network/core/tcp_content.cpp
@@ -183,8 +183,9 @@ bool NetworkContentSocketHandler::HandlePacket(Packet *p)
/**
* Receive a packet at TCP level
+ * @return Whether at least one packet was received.
*/
-void NetworkContentSocketHandler::ReceivePackets()
+bool NetworkContentSocketHandler::ReceivePackets()
{
/*
* We read only a few of the packets. This as receiving packets can be expensive
@@ -206,12 +207,15 @@ void NetworkContentSocketHandler::ReceivePackets()
* What arbitrary number to choose is the ultimate question though.
*/
Packet *p;
- int i = 42;
+ static const int MAX_PACKETS_TO_RECEIVE = 42;
+ int i = MAX_PACKETS_TO_RECEIVE;
while (--i != 0 && (p = this->ReceivePacket()) != NULL) {
bool cont = this->HandlePacket(p);
delete p;
- if (!cont) return;
+ if (!cont) return true;
}
+
+ return i != MAX_PACKETS_TO_RECEIVE - 1;
}
diff --git a/src/network/core/tcp_content.h b/src/network/core/tcp_content.h
index 5ad6ac5f4..a506439da 100644
--- a/src/network/core/tcp_content.h
+++ b/src/network/core/tcp_content.h
@@ -206,7 +206,7 @@ public:
/** On destructing of this class, the socket needs to be closed */
virtual ~NetworkContentSocketHandler() { this->Close(); }
- void ReceivePackets();
+ bool ReceivePackets();
};
#ifndef OPENTTD_MSU
diff --git a/src/network/network_content.cpp b/src/network/network_content.cpp
index 07bf8ab9f..e6e91897c 100644
--- a/src/network/network_content.cpp
+++ b/src/network/network_content.cpp
@@ -778,8 +778,10 @@ void ClientNetworkContentSocketHandler::SendReceive()
}
if (this->CanSendReceive()) {
- this->ReceivePackets();
- this->lastActivity = _realtime_tick;
+ if (this->ReceivePackets()) {
+ /* Only update activity once a packet is received, instead of everytime we try it. */
+ this->lastActivity = _realtime_tick;
+ }
}
this->SendPackets();