diff --git a/src/lib/arch/win32/ArchNetworkWinsock.cpp b/src/lib/arch/win32/ArchNetworkWinsock.cpp index c2e5a2038..621cb2acc 100644 --- a/src/lib/arch/win32/ArchNetworkWinsock.cpp +++ b/src/lib/arch/win32/ArchNetworkWinsock.cpp @@ -11,6 +11,7 @@ #include "arch/IArchMultithread.h" #include "arch/win32/ArchMultithreadWindows.h" #include "arch/win32/XArchWindows.h" +#include "base/Log.h" #include @@ -284,7 +285,7 @@ void ArchNetworkWinsock::bindSocket(ArchSocket s, ArchNetAddress addr) assert(s != nullptr); assert(addr != nullptr); - if (bind_winsock(s->m_socket, TYPED_ADDR(struct sockaddr, addr), addr->m_len) == SOCKET_ERROR) { + if (bind_winsock(s->m_socket, TYPED_ADDR(struct sockaddr, addr), addr->m_len) != ERROR_SUCCESS) { throwError(getsockerror_winsock()); } } @@ -294,7 +295,7 @@ void ArchNetworkWinsock::listenOnSocket(ArchSocket s) assert(s != nullptr); // hardcoding backlog - if (listen_winsock(s->m_socket, 3) == SOCKET_ERROR) { + if (listen_winsock(s->m_socket, 3) != ERROR_SUCCESS) { throwError(getsockerror_winsock()); } } @@ -606,23 +607,8 @@ bool ArchNetworkWinsock::setNoDelayOnSocket(ArchSocket s, bool noDelay) bool ArchNetworkWinsock::setReuseAddrOnSocket(ArchSocket s, bool reuse) { - assert(s != nullptr); - - // get old state - BOOL oflag; - int size = sizeof(oflag); - if (getsockopt_winsock(s->m_socket, SOL_SOCKET, SO_REUSEADDR, &oflag, &size) == SOCKET_ERROR) { - throwError(getsockerror_winsock()); - } - - // set new state - BOOL flag = reuse ? 1 : 0; - size = sizeof(flag); - if (setsockopt_winsock(s->m_socket, SOL_SOCKET, SO_REUSEADDR, &flag, size) == SOCKET_ERROR) { - throwError(getsockerror_winsock()); - } - - return (oflag != 0); + LOG_ERR("socket re-use not supported on windows"); + return false; } ArchNetAddress ArchNetworkWinsock::newAnyAddr(AddressFamily family) diff --git a/src/lib/net/TCPListenSocket.cpp b/src/lib/net/TCPListenSocket.cpp index 240e4e7a9..2392ce87e 100644 --- a/src/lib/net/TCPListenSocket.cpp +++ b/src/lib/net/TCPListenSocket.cpp @@ -50,9 +50,17 @@ TCPListenSocket::~TCPListenSocket() void TCPListenSocket::bind(const NetworkAddress &addr) { + LOG_DEBUG("binding to address: %s:%d", addr.getHostname().c_str(), addr.getPort()); try { std::scoped_lock lock{m_mutex}; + +#if SYSAPI_UNIX + // Only reuse socket addr on Unix so we can restart the server quickly (Unix holds the port + // in TIME_WAIT for a few mins after close). This is not needed on Windows and can cause issues + // because binding to a re-use port makes it look like the server is listening when it is not. ARCH->setReuseAddrOnSocket(m_socket, true); +#endif + ARCH->bindSocket(m_socket, addr.getAddress()); ARCH->listenOnSocket(m_socket); m_socketMultiplexer->addSocket(