summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorMax Hilbrunner <mhilbrunner@users.noreply.github.com>2018-09-22 17:23:30 +0200
committerGitHub <noreply@github.com>2018-09-22 17:23:30 +0200
commit397b01d590e5850762d25eaaa2951b1a76da46dc (patch)
tree3933703786b633fa5405102df8338dc4fa39c386 /drivers
parentd878c828b5094b4cef845889055d429b207bd070 (diff)
parentc37442ef0037ccbb63d3cce4caa918512193a06c (diff)
Merge pull request #22332 from Faless/udp_win_reset
Fix Winsock UDP ECONNRESET/ENETRESET bug
Diffstat (limited to 'drivers')
-rw-r--r--drivers/unix/net_socket_posix.cpp21
1 files changed, 21 insertions, 0 deletions
diff --git a/drivers/unix/net_socket_posix.cpp b/drivers/unix/net_socket_posix.cpp
index 07548ab91f..6e0bf97711 100644
--- a/drivers/unix/net_socket_posix.cpp
+++ b/drivers/unix/net_socket_posix.cpp
@@ -74,6 +74,8 @@
#elif defined(WINDOWS_ENABLED)
#include <winsock2.h>
#include <ws2tcpip.h>
+
+#include <mswsock.h>
// Some custom defines to minimize ifdefs
#define SOCK_EMPTY INVALID_SOCKET
#define SOCK_BUF(x) (char *)(x)
@@ -85,6 +87,10 @@
#ifndef MSG_NOSIGNAL
#define MSG_NOSIGNAL 0
#endif
+// Workaround missing flag in MinGW
+#if defined(__MINGW32__) && !defined(SIO_UDP_NETRESET)
+#define SIO_UDP_NETRESET _WSAIOW(IOC_VENDOR, 15)
+#endif
#endif
@@ -258,6 +264,21 @@ Error NetSocketPosix::open(Type p_sock_type, IP::Type &ip_type) {
}
_is_stream = p_sock_type == TYPE_TCP;
+
+#if defined(WINDOWS_ENABLED)
+ if (!_is_stream) {
+ // Disable windows feature/bug reporting WSAECONNRESET/WSAENETRESET when
+ // recv/recvfrom and an ICMP reply was received from a previous send/sendto.
+ unsigned long disable = 0;
+ if (ioctlsocket(_sock, SIO_UDP_CONNRESET, &disable) == SOCKET_ERROR) {
+ print_verbose("Unable to turn off UDP WSAECONNRESET behaviour on Windows");
+ }
+ if (ioctlsocket(_sock, SIO_UDP_NETRESET, &disable) == SOCKET_ERROR) {
+ // This feature seems not to be supported on wine.
+ print_verbose("Unable to turn off UDP WSAENETRESET behaviour on Windows");
+ }
+ }
+#endif
return OK;
}