summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2011-02-12 21:09:34 +0000
committerrubidium <rubidium@openttd.org>2011-02-12 21:09:34 +0000
commitadfd64803108b0f418a5f5cb4ea96b25d2eaa45c (patch)
tree8499c1ad40825fb458503fe9f84c7e97dc2ba691
parent92d0d6d10b815700e72869e87da044ffafd1c9bb (diff)
downloadopenttd-adfd64803108b0f418a5f5cb4ea96b25d2eaa45c.tar.xz
(svn r22068) -Codechange/Fix: return "connection lost" instead of "okay" when SendPackets closed the connection
-rw-r--r--src/network/core/tcp.cpp21
-rw-r--r--src/network/core/tcp.h11
-rw-r--r--src/network/network_server.cpp24
3 files changed, 34 insertions, 22 deletions
diff --git a/src/network/core/tcp.cpp b/src/network/core/tcp.cpp
index 66f19107c..9a6704006 100644
--- a/src/network/core/tcp.cpp
+++ b/src/network/core/tcp.cpp
@@ -90,14 +90,14 @@ void NetworkTCPSocketHandler::SendPacket(Packet *packet)
* @return \c true if a (part of a) packet could be sent and
* the connection is not closed yet.
*/
-bool NetworkTCPSocketHandler::SendPackets(bool closing_down)
+SendPacketsState NetworkTCPSocketHandler::SendPackets(bool closing_down)
{
ssize_t res;
Packet *p;
/* We can not write to this socket!! */
- if (!this->writable) return false;
- if (!this->IsConnected()) return false;
+ if (!this->writable) return SPS_NONE_SENT;
+ if (!this->IsConnected()) return SPS_CLOSED;
p = this->packet_queue;
while (p != NULL) {
@@ -110,14 +110,14 @@ bool NetworkTCPSocketHandler::SendPackets(bool closing_down)
DEBUG(net, 0, "send failed with error %d", err);
this->CloseConnection();
}
- return false;
+ return SPS_CLOSED;
}
- return true;
+ return SPS_PARTLY_SENT;
}
if (res == 0) {
/* Client/server has left us :( */
if (!closing_down) this->CloseConnection();
- return false;
+ return SPS_CLOSED;
}
p->pos += res;
@@ -129,11 +129,11 @@ bool NetworkTCPSocketHandler::SendPackets(bool closing_down)
delete p;
p = this->packet_queue;
} else {
- return true;
+ return SPS_PARTLY_SENT;
}
}
- return true;
+ return SPS_ALL_SENT;
}
/**
@@ -216,11 +216,6 @@ Packet *NetworkTCPSocketHandler::ReceivePacket()
return p;
}
-bool NetworkTCPSocketHandler::IsPacketQueueEmpty()
-{
- return this->packet_queue == NULL;
-}
-
/**
* Check whether this socket can send or receive something.
* @return \c true when there is something to receive.
diff --git a/src/network/core/tcp.h b/src/network/core/tcp.h
index d14de7cc1..2092e1e32 100644
--- a/src/network/core/tcp.h
+++ b/src/network/core/tcp.h
@@ -19,6 +19,14 @@
#ifdef ENABLE_NETWORK
+/** The states of sending the packets. */
+enum SendPacketsState {
+ SPS_CLOSED, ///< The connection got closed.
+ SPS_NONE_SENT, ///< The buffer is still full, so no (parts of) packets could be sent.
+ SPS_PARTLY_SENT, ///< The packets are partly sent; there are more packets to be sent in the queue.
+ SPS_ALL_SENT, ///< All packets in the queue are sent.
+};
+
/** Base socket handler for all TCP sockets */
class NetworkTCPSocketHandler : public NetworkSocketHandler {
private:
@@ -36,8 +44,7 @@ public:
virtual NetworkRecvStatus CloseConnection(bool error = true);
virtual void SendPacket(Packet *packet);
- bool SendPackets(bool closing_down = false);
- bool IsPacketQueueEmpty();
+ SendPacketsState SendPackets(bool closing_down = false);
virtual Packet *ReceivePacket();
diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp
index 071903797..d465078a7 100644
--- a/src/network/network_server.cpp
+++ b/src/network/network_server.cpp
@@ -573,13 +573,23 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendMap()
if (this->savegame_mutex != NULL) this->savegame_mutex->EndCritical();
- /* Send all packets (forced) and check if we have send it all */
- if (this->SendPackets() && this->IsPacketQueueEmpty()) {
- /* All are sent, increase the sent_packets */
- if (this->savegame_packets != NULL) sent_packets *= 2;
- } else {
- /* Not everything is sent, decrease the sent_packets */
- if (sent_packets > 1) sent_packets /= 2;
+ switch (this->SendPackets()) {
+ case SPS_CLOSED:
+ return NETWORK_RECV_STATUS_CONN_LOST;
+
+ case SPS_ALL_SENT:
+ /* All are sent, increase the sent_packets */
+ if (this->savegame_packets != NULL) sent_packets *= 2;
+ break;
+
+ case SPS_PARTLY_SENT:
+ /* Only a part is sent; leave the transmission state. */
+ break;
+
+ case SPS_NONE_SENT:
+ /* Not everything is sent, decrease the sent_packets */
+ if (sent_packets > 1) sent_packets /= 2;
+ break;
}
}
return NETWORK_RECV_STATUS_OKAY;