From 67a824607797706f2058aa70fb629f0589a90103 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Perrier Date: Mon, 25 Jan 2021 17:54:16 +0100 Subject: [PATCH] Revamp IsReadable & IsWriteable. --- Source/Engine/Platform/Base/NetworkBase.cpp | 7 +++- Source/Engine/Platform/Base/NetworkBase.h | 3 +- Source/Engine/Platform/Win32/Win32Network.cpp | 42 ++++++++++++++++--- Source/Engine/Platform/Win32/Win32Network.h | 3 +- 4 files changed, 46 insertions(+), 9 deletions(-) diff --git a/Source/Engine/Platform/Base/NetworkBase.cpp b/Source/Engine/Platform/Base/NetworkBase.cpp index 73b649281..e7b700911 100644 --- a/Source/Engine/Platform/Base/NetworkBase.cpp +++ b/Source/Engine/Platform/Base/NetworkBase.cpp @@ -61,11 +61,16 @@ bool NetworkBase::Accept(NetworkSocket& serverSock, NetworkSocket& newSock, Netw return false; } -bool NetworkBase::IsReadable(NetworkSocket& socket, uint64* size) +bool NetworkBase::IsReadable(NetworkSocket& socket) { return false; } +bool NetworkBase::IsWriteable(NetworkSocket& socket) +{ + return true; +} + int32 NetworkBase::WriteSocket(NetworkSocket socket, byte* data, uint32 length, NetworkEndPoint* endPoint) { return 0; diff --git a/Source/Engine/Platform/Base/NetworkBase.h b/Source/Engine/Platform/Base/NetworkBase.h index a568fd215..295100ffe 100644 --- a/Source/Engine/Platform/Base/NetworkBase.h +++ b/Source/Engine/Platform/Base/NetworkBase.h @@ -69,7 +69,8 @@ class FLAXENGINE_API NetworkBase static bool BindSocket(NetworkSocket& socket, NetworkEndPoint& endPoint); static bool Listen(NetworkSocket& socket, uint16 queueSize); static bool Accept(NetworkSocket& serverSock, NetworkSocket& newSock, NetworkEndPoint& newEndPoint); - static bool IsReadable(NetworkSocket& socket, uint64* size); + static bool IsReadable(NetworkSocket& socket); + static bool IsWriteable(NetworkSocket& socket); static int32 WriteSocket(NetworkSocket socket, byte* data, uint32 length, NetworkEndPoint* endPoint = nullptr); static int32 ReadSocket(NetworkSocket socket, byte* buffer, uint32 bufferSize, NetworkEndPoint* endPoint = nullptr); static bool CreateEndPoint(String* address, String* port, NetworkIPVersion ipv, NetworkEndPoint& endPoint, bool bindable = false); diff --git a/Source/Engine/Platform/Win32/Win32Network.cpp b/Source/Engine/Platform/Win32/Win32Network.cpp index 77c0baf4d..e0f82de6b 100644 --- a/Source/Engine/Platform/Win32/Win32Network.cpp +++ b/Source/Engine/Platform/Win32/Win32Network.cpp @@ -288,15 +288,45 @@ bool Win32Network::Accept(NetworkSocket& serverSock, NetworkSocket& newSock, Net return false; } -bool Win32Network::IsReadable(NetworkSocket& socket, uint64* size) +bool Win32Network::IsReadable(NetworkSocket& socket) { - unsigned long value; - if (ioctlsocket(*(SOCKET*)socket.Data, FIONREAD, &value) != 0) + fd_set readfds; + FD_ZERO(&readfds); + FD_SET(*(SOCKET*)socket.Data, &readfds); + timeval t; + t.tv_sec = 0; + t.tv_usec = 0; + if (select(0, &readfds, nullptr, nullptr, &t) == SOCKET_ERROR) { - LOG(Error, "Unable to query socket for readability! Socket : {0} Error : {1}", *(SOCKET*)socket.Data, GetLastErrorMessage().Get()); - return true; + int error = WSAGetLastError(); + if (error == WSAEWOULDBLOCK) + return false; + LOG(Error, "Unable to check readability of socket! Socket : {0} Error : {1}", *(SOCKET*)socket.Data, GetErrorMessage(error).Get()); + return false; } - *size = value; + if (FD_ISSET(*(SOCKET*)socket.Data, &readfds)) + return true; + return false; +} + +bool Win32Network::IsWriteable(NetworkSocket& socket) +{ + fd_set writefds; + FD_ZERO(&writefds); + FD_SET(*(SOCKET*)socket.Data, &writefds); + timeval t; + t.tv_sec = 0; + t.tv_usec = 0; + if (select(0, nullptr, &writefds, nullptr, &t) == SOCKET_ERROR) + { + int error = WSAGetLastError(); + if (error == WSAEWOULDBLOCK) + return false; + LOG(Error, "Unable to check writeability of socket! Socket : {0} Error : {1}", *(SOCKET*)socket.Data, GetErrorMessage(error).Get()); + return false; + } + if (FD_ISSET(*(SOCKET*)socket.Data, &writefds)) + return true; return false; } diff --git a/Source/Engine/Platform/Win32/Win32Network.h b/Source/Engine/Platform/Win32/Win32Network.h index 8cbcf57ec..bbf15a4c4 100644 --- a/Source/Engine/Platform/Win32/Win32Network.h +++ b/Source/Engine/Platform/Win32/Win32Network.h @@ -25,7 +25,8 @@ public: static bool BindSocket(NetworkSocket& socket, NetworkEndPoint& endPoint); static bool Listen(NetworkSocket& socket, uint16 queueSize); static bool Accept(NetworkSocket& serverSock, NetworkSocket& newSock, NetworkEndPoint& newEndPoint); - static bool IsReadable(NetworkSocket& socket, uint64* size); + static bool IsReadable(NetworkSocket& socket); + static bool IsWriteable(NetworkSocket& socket); static int32 WriteSocket(NetworkSocket socket, byte* data, uint32 length, NetworkEndPoint* endPoint = nullptr); static int32 ReadSocket(NetworkSocket socket, byte* buffer, uint32 bufferSize, NetworkEndPoint* endPoint = nullptr); static bool CreateEndPoint(String* address, String* port, NetworkIPVersion ipv, NetworkEndPoint& endPoint, bool bindable = false);