From 980ef8f9dc49a61879be6d218700248f96391561 Mon Sep 17 00:00:00 2001 From: Emil Ljungdahl <111423223+pando-emil@users.noreply.github.com> Date: Mon, 9 Jan 2023 05:42:16 +0100 Subject: [PATCH] Implement non-blocking recvfrom on Windows (#1124) This pull request is a split of PR #1061 As @KangLin pointed out in the original PR those sockets should ideally be permanently non-blocking for performance reasons, but they are NOT at the moment. Someone with more knowledge about the code in dtls_listener.c should probably have a look if it would be feasible to change the sockets to non-blocking already at creation, similar to what is done in udpserver.c... --- src/apps/relay/dtls_listener.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/apps/relay/dtls_listener.c b/src/apps/relay/dtls_listener.c index 21bc81a..5a9005b 100644 --- a/src/apps/relay/dtls_listener.c +++ b/src/apps/relay/dtls_listener.c @@ -621,8 +621,9 @@ start_udp_cycle: ssize_t bsize = 0; #if defined(WINDOWS) - // TODO: implement it!!! int flags = 0; + u_long iMode = 1; + ioctlsocket(fd, FIONBIO, &iMode); #else int flags = MSG_DONTWAIT; #endif @@ -633,6 +634,11 @@ start_udp_cycle: int conn_reset = is_connreset(); int to_block = would_block(); +#if defined(WINDOWS) + iMode = 0; + ioctlsocket(fd, FIONBIO, &iMode); +#endif + if (bsize < 0) { if (to_block) { @@ -645,8 +651,9 @@ start_udp_cycle: #if defined(MSG_ERRQUEUE) #if defined(WINDOWS) - // TODO: implement it!!! int eflags = MSG_ERRQUEUE; + iMode = 1; + ioctlsocket(fd, FIONBIO, &iMode); #else // Linux int eflags = MSG_ERRQUEUE | MSG_DONTWAIT; @@ -668,6 +675,11 @@ start_udp_cycle: conn_reset = is_connreset(); to_block = would_block(); +#if defined(WINDOWS) + iMode = 0; + ioctlsocket(fd, FIONBIO, &iMode); +#endif + #endif if (conn_reset) {