diff options
Diffstat (limited to 'src/network/core')
-rw-r--r-- | src/network/core/tcp.cpp | 27 | ||||
-rw-r--r-- | src/network/core/tcp.h | 2 |
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(); }; |