Revamp IsReadable & IsWriteable.

This commit is contained in:
Jean-Baptiste Perrier
2021-01-25 17:54:16 +01:00
parent 330a588260
commit 67a8246077
4 changed files with 46 additions and 9 deletions

View File

@@ -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;

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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);