summaryrefslogtreecommitdiff
path: root/src/network/core
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2010-10-15 19:33:08 +0000
committerrubidium <rubidium@openttd.org>2010-10-15 19:33:08 +0000
commitf555e6d72ed960a9311b8a38321ffb3d799ecc18 (patch)
tree4fc4fa0b87d9bde361b2945f308fd0246c51ecf1 /src/network/core
parent780f120c3275a78b33271596fb8daaa45dd41c7c (diff)
downloadopenttd-f555e6d72ed960a9311b8a38321ffb3d799ecc18.tar.xz
(svn r20933) -Codechange: move some more client related methods and such to network_client.cpp
Diffstat (limited to 'src/network/core')
-rw-r--r--src/network/core/tcp.cpp27
-rw-r--r--src/network/core/tcp.h2
2 files changed, 29 insertions, 0 deletions
diff --git a/src/network/core/tcp.cpp b/src/network/core/tcp.cpp
index 39f90569f..cdf072cec 100644
--- a/src/network/core/tcp.cpp
+++ b/src/network/core/tcp.cpp
@@ -214,4 +214,31 @@ 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.
+ * @note Sets #writeable if more data can be sent.
+ */
+bool NetworkTCPSocketHandler::CanSendReceive()
+{
+ fd_set read_fd, write_fd;
+ struct timeval tv;
+
+ FD_ZERO(&read_fd);
+ FD_ZERO(&write_fd);
+
+ FD_SET(this->sock, &read_fd);
+ FD_SET(this->sock, &write_fd);
+
+ tv.tv_sec = tv.tv_usec = 0; // don't block at all.
+#if !defined(__MORPHOS__) && !defined(__AMIGA__)
+ select(FD_SETSIZE, &read_fd, &write_fd, NULL, &tv);
+#else
+ WaitSelect(FD_SETSIZE, &read_fd, &write_fd, NULL, &tv, NULL);
+#endif
+
+ this->writable = !!FD_ISSET(this->sock, &write_fd);
+ return FD_ISSET(this->sock, &read_fd);
+}
+
#endif /* ENABLE_NETWORK */
diff --git a/src/network/core/tcp.h b/src/network/core/tcp.h
index b9866cc4e..86c568edf 100644
--- a/src/network/core/tcp.h
+++ b/src/network/core/tcp.h
@@ -41,6 +41,8 @@ public:
Packet *Recv_Packet();
+ bool CanSendReceive();
+
NetworkTCPSocketHandler(SOCKET s = INVALID_SOCKET);
~NetworkTCPSocketHandler();
};