|
|
@ -2078,44 +2078,21 @@ bool CConnman::BindListenPort(const CService &addrBind, std::string& strError, b |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
SOCKET hListenSocket = socket(((struct sockaddr*)&sockaddr)->sa_family, SOCK_STREAM, IPPROTO_TCP); |
|
|
|
SOCKET hListenSocket = CreateSocket(addrBind); |
|
|
|
if (hListenSocket == INVALID_SOCKET) |
|
|
|
if (hListenSocket == INVALID_SOCKET) |
|
|
|
{ |
|
|
|
{ |
|
|
|
strError = strprintf("Error: Couldn't open socket for incoming connections (socket returned error %s)", NetworkErrorString(WSAGetLastError())); |
|
|
|
strError = strprintf("Error: Couldn't open socket for incoming connections (socket returned error %s)", NetworkErrorString(WSAGetLastError())); |
|
|
|
LogPrintf("%s\n", strError); |
|
|
|
LogPrintf("%s\n", strError); |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
if (!IsSelectableSocket(hListenSocket)) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
strError = "Error: Couldn't create a listenable socket for incoming connections"; |
|
|
|
|
|
|
|
LogPrintf("%s\n", strError); |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef WIN32 |
|
|
|
#ifndef WIN32 |
|
|
|
#ifdef SO_NOSIGPIPE |
|
|
|
|
|
|
|
// Different way of disabling SIGPIPE on BSD
|
|
|
|
|
|
|
|
setsockopt(hListenSocket, SOL_SOCKET, SO_NOSIGPIPE, (void*)&nOne, sizeof(int)); |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
// Allow binding if the port is still in TIME_WAIT state after
|
|
|
|
// Allow binding if the port is still in TIME_WAIT state after
|
|
|
|
// the program was closed and restarted.
|
|
|
|
// the program was closed and restarted.
|
|
|
|
setsockopt(hListenSocket, SOL_SOCKET, SO_REUSEADDR, (void*)&nOne, sizeof(int)); |
|
|
|
setsockopt(hListenSocket, SOL_SOCKET, SO_REUSEADDR, (void*)&nOne, sizeof(int)); |
|
|
|
// Disable Nagle's algorithm
|
|
|
|
|
|
|
|
setsockopt(hListenSocket, IPPROTO_TCP, TCP_NODELAY, (void*)&nOne, sizeof(int)); |
|
|
|
|
|
|
|
#else |
|
|
|
#else |
|
|
|
setsockopt(hListenSocket, SOL_SOCKET, SO_REUSEADDR, (const char*)&nOne, sizeof(int)); |
|
|
|
setsockopt(hListenSocket, SOL_SOCKET, SO_REUSEADDR, (const char*)&nOne, sizeof(int)); |
|
|
|
setsockopt(hListenSocket, IPPROTO_TCP, TCP_NODELAY, (const char*)&nOne, sizeof(int)); |
|
|
|
|
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
// Set to non-blocking, incoming connections will also inherit this
|
|
|
|
|
|
|
|
if (!SetSocketNonBlocking(hListenSocket, true)) { |
|
|
|
|
|
|
|
CloseSocket(hListenSocket); |
|
|
|
|
|
|
|
strError = strprintf("BindListenPort: Setting listening socket to non-blocking failed, error %s\n", NetworkErrorString(WSAGetLastError())); |
|
|
|
|
|
|
|
LogPrintf("%s\n", strError); |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// some systems don't have IPV6_V6ONLY but are always v6only; others do have the option
|
|
|
|
// some systems don't have IPV6_V6ONLY but are always v6only; others do have the option
|
|
|
|
// and enable it by default or not. Try to enable it, if possible.
|
|
|
|
// and enable it by default or not. Try to enable it, if possible.
|
|
|
|
if (addrBind.IsIPv6()) { |
|
|
|
if (addrBind.IsIPv6()) { |
|
|
|