From f555e6d72ed960a9311b8a38321ffb3d799ecc18 Mon Sep 17 00:00:00 2001 From: rubidium Date: Fri, 15 Oct 2010 19:33:08 +0000 Subject: (svn r20933) -Codechange: move some more client related methods and such to network_client.cpp --- src/network/core/tcp.cpp | 27 +++++++++++++++++++++++++++ src/network/core/tcp.h | 2 ++ 2 files changed, 29 insertions(+) (limited to 'src/network/core') 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(); }; -- cgit v1.2.3-70-g09d2