From 53ddb39e1916d1546e98e5dc0570f8e78e61c7d1 Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 27 Nov 2017 18:50:49 +0000 Subject: [PATCH] Add non-blocking recv function to Socket class --- renderdoc/os/os_specific.h | 1 + renderdoc/os/posix/posix_network.cpp | 32 ++++++++++++++++++++++++++++ renderdoc/os/win32/win32_network.cpp | 32 ++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+) diff --git a/renderdoc/os/os_specific.h b/renderdoc/os/os_specific.h index 0452d1926..0fe24ab7a 100644 --- a/renderdoc/os/os_specific.h +++ b/renderdoc/os/os_specific.h @@ -147,6 +147,7 @@ public: bool SendDataBlocking(const void *buf, uint32_t length); bool RecvDataBlocking(void *data, uint32_t length); + bool RecvDataNonBlocking(void *data, uint32_t &length); private: ptrdiff_t socket; diff --git a/renderdoc/os/posix/posix_network.cpp b/renderdoc/os/posix/posix_network.cpp index 2937bf95e..82d967eed 100644 --- a/renderdoc/os/posix/posix_network.cpp +++ b/renderdoc/os/posix/posix_network.cpp @@ -183,6 +183,38 @@ bool Socket::IsRecvDataWaiting() return ret > 0; } +bool Socket::RecvDataNonBlocking(void *buf, uint32_t &length) +{ + if(length == 0) + return true; + + // socket is already blocking, don't have to change anything + int ret = recv(socket, (char *)buf, length, 0); + + if(ret > 0) + { + length = (uint32_t)ret; + } + else + { + length = 0; + int err = errno; + + if(err == EWOULDBLOCK || err == EAGAIN) + { + return true; + } + else + { + RDCWARN("recv: %d", err); + Shutdown(); + return false; + } + } + + return true; +} + bool Socket::RecvDataBlocking(void *buf, uint32_t length) { if(length == 0) diff --git a/renderdoc/os/win32/win32_network.cpp b/renderdoc/os/win32/win32_network.cpp index 4727ec02f..3c4e44135 100644 --- a/renderdoc/os/win32/win32_network.cpp +++ b/renderdoc/os/win32/win32_network.cpp @@ -184,6 +184,38 @@ bool Socket::IsRecvDataWaiting() return ret > 0; } +bool Socket::RecvDataNonBlocking(void *buf, uint32_t &length) +{ + if(length == 0) + return true; + + // socket is already blocking, don't have to change anything + int ret = recv(socket, (char *)buf, length, 0); + + if(ret > 0) + { + length = (uint32_t)ret; + } + else + { + length = 0; + int err = WSAGetLastError(); + + if(err == WSAEWOULDBLOCK) + { + return true; + } + else + { + RDCWARN("recv: %d", err); + Shutdown(); + return false; + } + } + + return true; +} + bool Socket::RecvDataBlocking(void *buf, uint32_t length) { if(length == 0)