diff options
Diffstat (limited to 'src/network/core/tcp.cpp')
-rw-r--r-- | src/network/core/tcp.cpp | 27 |
1 files changed, 27 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 */ |