|
|
|
@ -990,57 +990,61 @@ void ThreadSocketHandler()
@@ -990,57 +990,61 @@ void ThreadSocketHandler()
|
|
|
|
|
// Accept new connections
|
|
|
|
|
//
|
|
|
|
|
if (!IsI2POnly()) |
|
|
|
|
BOOST_FOREACH(SOCKET hListenSocket, vhListenSocket) |
|
|
|
|
if (hListenSocket != INVALID_SOCKET && FD_ISSET(hListenSocket, &fdsetRecv)) |
|
|
|
|
{ |
|
|
|
|
BOOST_FOREACH(SOCKET hListenSocket, vhListenSocket) |
|
|
|
|
{ |
|
|
|
|
if (hListenSocket != INVALID_SOCKET && FD_ISSET(hListenSocket, &fdsetRecv)) |
|
|
|
|
{ |
|
|
|
|
#ifdef USE_IPV6 |
|
|
|
|
struct sockaddr_storage sockaddr; |
|
|
|
|
struct sockaddr_storage sockaddr; |
|
|
|
|
#else |
|
|
|
|
struct sockaddr sockaddr; |
|
|
|
|
struct sockaddr sockaddr; |
|
|
|
|
#endif |
|
|
|
|
socklen_t len = sizeof(sockaddr); |
|
|
|
|
SOCKET hSocket = accept(hListenSocket, (struct sockaddr*)&sockaddr, &len); |
|
|
|
|
CAddress addr; |
|
|
|
|
int nInbound = 0; |
|
|
|
|
socklen_t len = sizeof(sockaddr); |
|
|
|
|
SOCKET hSocket = accept(hListenSocket, (struct sockaddr*)&sockaddr, &len); |
|
|
|
|
CAddress addr; |
|
|
|
|
int nInbound = 0; |
|
|
|
|
|
|
|
|
|
if (hSocket != INVALID_SOCKET) |
|
|
|
|
if (!addr.SetSockAddr((const struct sockaddr*)&sockaddr)) |
|
|
|
|
printf("Warning: Unknown socket family\n"); |
|
|
|
|
if (hSocket != INVALID_SOCKET) |
|
|
|
|
if (!addr.SetSockAddr((const struct sockaddr*)&sockaddr)) |
|
|
|
|
printf("Warning: Unknown socket family\n"); |
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
LOCK(cs_vNodes); |
|
|
|
|
BOOST_FOREACH(CNode* pnode, vNodes) |
|
|
|
|
if (pnode->fInbound) |
|
|
|
|
nInbound++; |
|
|
|
|
} |
|
|
|
|
{ |
|
|
|
|
LOCK(cs_vNodes); |
|
|
|
|
BOOST_FOREACH(CNode* pnode, vNodes) |
|
|
|
|
if (pnode->fInbound) |
|
|
|
|
nInbound++; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (hSocket == INVALID_SOCKET) |
|
|
|
|
{ |
|
|
|
|
int nErr = WSAGetLastError(); |
|
|
|
|
if (nErr != WSAEWOULDBLOCK) |
|
|
|
|
printf("socket error accept failed: %d\n", nErr); |
|
|
|
|
} |
|
|
|
|
else if (nInbound >= nMaxConnections - MAX_OUTBOUND_CONNECTIONS) |
|
|
|
|
{ |
|
|
|
|
{ |
|
|
|
|
LOCK(cs_setservAddNodeAddresses); |
|
|
|
|
if (!setservAddNodeAddresses.count(addr)) |
|
|
|
|
if (hSocket == INVALID_SOCKET) |
|
|
|
|
{ |
|
|
|
|
int nErr = WSAGetLastError(); |
|
|
|
|
if (nErr != WSAEWOULDBLOCK) |
|
|
|
|
printf("socket error accept failed: %d\n", nErr); |
|
|
|
|
} |
|
|
|
|
else if (nInbound >= nMaxConnections - MAX_OUTBOUND_CONNECTIONS) |
|
|
|
|
{ |
|
|
|
|
{ |
|
|
|
|
LOCK(cs_setservAddNodeAddresses); |
|
|
|
|
if (!setservAddNodeAddresses.count(addr)) |
|
|
|
|
closesocket(hSocket); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else if (CNode::IsBanned(addr)) |
|
|
|
|
{ |
|
|
|
|
printf("connection from %s dropped (banned)\n", addr.ToString().c_str()); |
|
|
|
|
closesocket(hSocket); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else if (CNode::IsBanned(addr)) |
|
|
|
|
{ |
|
|
|
|
printf("connection from %s dropped (banned)\n", addr.ToString().c_str()); |
|
|
|
|
closesocket(hSocket); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
printf("accepted connection %s\n", addr.ToString().c_str()); |
|
|
|
|
CNode* pnode = new CNode(hSocket, addr, "", true); |
|
|
|
|
pnode->AddRef(); |
|
|
|
|
{ |
|
|
|
|
LOCK(cs_vNodes); |
|
|
|
|
vNodes.push_back(pnode); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
printf("accepted connection %s\n", addr.ToString().c_str()); |
|
|
|
|
CNode* pnode = new CNode(hSocket, addr, "", true); |
|
|
|
|
pnode->AddRef(); |
|
|
|
|
{ |
|
|
|
|
LOCK(cs_vNodes); |
|
|
|
|
vNodes.push_back(pnode); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|