Disable NetSocket reuse address on Windows.

It actually means reuse port -.- ...

(cherry picked from commits cae0d8853d
and 19ef28a614)
This commit is contained in:
Fabio Alessandrelli 2020-02-18 12:55:18 +01:00 committed by Rémi Verschelde
parent 0ad54edeae
commit ec4abf421a
1 changed files with 8 additions and 3 deletions

View File

@ -673,22 +673,27 @@ void NetSocketPosix::set_tcp_no_delay_enabled(bool p_enabled) {
void NetSocketPosix::set_reuse_address_enabled(bool p_enabled) { void NetSocketPosix::set_reuse_address_enabled(bool p_enabled) {
ERR_FAIL_COND(!is_open()); ERR_FAIL_COND(!is_open());
// On Windows, enabling SO_REUSEADDR actually would also enable reuse port, very bad on TCP. Denying...
// Windows does not have this option, SO_REUSEADDR in this magical world means SO_REUSEPORT
#ifndef WINDOWS_ENABLED
int par = p_enabled ? 1 : 0; int par = p_enabled ? 1 : 0;
if (setsockopt(_sock, SOL_SOCKET, SO_REUSEADDR, SOCK_CBUF(&par), sizeof(int)) < 0) { if (setsockopt(_sock, SOL_SOCKET, SO_REUSEADDR, SOCK_CBUF(&par), sizeof(int)) < 0) {
WARN_PRINT("Unable to set socket REUSEADDR option!"); WARN_PRINT("Unable to set socket REUSEADDR option!");
} }
#endif
} }
void NetSocketPosix::set_reuse_port_enabled(bool p_enabled) { void NetSocketPosix::set_reuse_port_enabled(bool p_enabled) {
// Windows does not have this option, as it is always ON when setting REUSEADDR.
#ifndef WINDOWS_ENABLED
ERR_FAIL_COND(!is_open()); ERR_FAIL_COND(!is_open());
// See comment above...
#ifdef WINDOWS_ENABLED
#define SO_REUSEPORT SO_REUSEADDR
#endif
int par = p_enabled ? 1 : 0; int par = p_enabled ? 1 : 0;
if (setsockopt(_sock, SOL_SOCKET, SO_REUSEPORT, SOCK_CBUF(&par), sizeof(int)) < 0) { if (setsockopt(_sock, SOL_SOCKET, SO_REUSEPORT, SOCK_CBUF(&par), sizeof(int)) < 0) {
WARN_PRINT("Unable to set socket REUSEPORT option!"); WARN_PRINT("Unable to set socket REUSEPORT option!");
} }
#endif
} }
bool NetSocketPosix::is_open() const { bool NetSocketPosix::is_open() const {