Merge pull request #22332 from Faless/udp_win_reset

Fix Winsock UDP ECONNRESET/ENETRESET bug
This commit is contained in:
Max Hilbrunner 2018-09-22 17:23:30 +02:00 committed by GitHub
commit 397b01d590
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

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