|
|
@ -776,6 +776,67 @@ void SocketSendData(CNode *pnode) |
|
|
|
|
|
|
|
|
|
|
|
static list<CNode*> vNodesDisconnected; |
|
|
|
static list<CNode*> vNodesDisconnected; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void AcceptConnection(const ListenSocket& hListenSocket) { |
|
|
|
|
|
|
|
struct sockaddr_storage sockaddr; |
|
|
|
|
|
|
|
socklen_t len = sizeof(sockaddr); |
|
|
|
|
|
|
|
SOCKET hSocket = accept(hListenSocket.socket, (struct sockaddr*)&sockaddr, &len); |
|
|
|
|
|
|
|
CAddress addr; |
|
|
|
|
|
|
|
int nInbound = 0; |
|
|
|
|
|
|
|
int nMaxInbound = nMaxConnections - MAX_OUTBOUND_CONNECTIONS; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (hSocket != INVALID_SOCKET) |
|
|
|
|
|
|
|
if (!addr.SetSockAddr((const struct sockaddr*)&sockaddr)) |
|
|
|
|
|
|
|
LogPrintf("Warning: Unknown socket family\n"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool whitelisted = hListenSocket.whitelisted || CNode::IsWhitelistedRange(addr); |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
LOCK(cs_vNodes); |
|
|
|
|
|
|
|
BOOST_FOREACH(CNode* pnode, vNodes) |
|
|
|
|
|
|
|
if (pnode->fInbound) |
|
|
|
|
|
|
|
nInbound++; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (hSocket == INVALID_SOCKET) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
int nErr = WSAGetLastError(); |
|
|
|
|
|
|
|
if (nErr != WSAEWOULDBLOCK) |
|
|
|
|
|
|
|
LogPrintf("socket error accept failed: %s\n", NetworkErrorString(nErr)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else if (!IsSelectableSocket(hSocket)) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
LogPrintf("connection from %s dropped: non-selectable socket\n", addr.ToString()); |
|
|
|
|
|
|
|
CloseSocket(hSocket); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else if (nInbound >= nMaxInbound) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
LogPrint("net", "connection from %s dropped (full)\n", addr.ToString()); |
|
|
|
|
|
|
|
CloseSocket(hSocket); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else if (!whitelisted && (nInbound >= (nMaxInbound - nWhiteConnections))) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
LogPrint("net", "connection from %s dropped (non-whitelisted)\n", addr.ToString()); |
|
|
|
|
|
|
|
CloseSocket(hSocket); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else if (CNode::IsBanned(addr) && !whitelisted) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
LogPrintf("connection from %s dropped (banned)\n", addr.ToString()); |
|
|
|
|
|
|
|
CloseSocket(hSocket); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
CNode* pnode = new CNode(hSocket, addr, "", true); |
|
|
|
|
|
|
|
pnode->AddRef(); |
|
|
|
|
|
|
|
pnode->fWhitelisted = whitelisted; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LogPrint("net", "connection from %s accepted\n", addr.ToString()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
LOCK(cs_vNodes); |
|
|
|
|
|
|
|
vNodes.push_back(pnode); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void ThreadSocketHandler() |
|
|
|
void ThreadSocketHandler() |
|
|
|
{ |
|
|
|
{ |
|
|
|
unsigned int nPrevNodeCount = 0; |
|
|
|
unsigned int nPrevNodeCount = 0; |
|
|
@ -933,64 +994,7 @@ void ThreadSocketHandler() |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (hListenSocket.socket != INVALID_SOCKET && FD_ISSET(hListenSocket.socket, &fdsetRecv)) |
|
|
|
if (hListenSocket.socket != INVALID_SOCKET && FD_ISSET(hListenSocket.socket, &fdsetRecv)) |
|
|
|
{ |
|
|
|
{ |
|
|
|
struct sockaddr_storage sockaddr; |
|
|
|
AcceptConnection(hListenSocket); |
|
|
|
socklen_t len = sizeof(sockaddr); |
|
|
|
|
|
|
|
SOCKET hSocket = accept(hListenSocket.socket, (struct sockaddr*)&sockaddr, &len); |
|
|
|
|
|
|
|
CAddress addr; |
|
|
|
|
|
|
|
int nInbound = 0; |
|
|
|
|
|
|
|
int nMaxInbound = nMaxConnections - MAX_OUTBOUND_CONNECTIONS; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (hSocket != INVALID_SOCKET) |
|
|
|
|
|
|
|
if (!addr.SetSockAddr((const struct sockaddr*)&sockaddr)) |
|
|
|
|
|
|
|
LogPrintf("Warning: Unknown socket family\n"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool whitelisted = hListenSocket.whitelisted || CNode::IsWhitelistedRange(addr); |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
LOCK(cs_vNodes); |
|
|
|
|
|
|
|
BOOST_FOREACH(CNode* pnode, vNodes) |
|
|
|
|
|
|
|
if (pnode->fInbound) |
|
|
|
|
|
|
|
nInbound++; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (hSocket == INVALID_SOCKET) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
int nErr = WSAGetLastError(); |
|
|
|
|
|
|
|
if (nErr != WSAEWOULDBLOCK) |
|
|
|
|
|
|
|
LogPrintf("socket error accept failed: %s\n", NetworkErrorString(nErr)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else if (!IsSelectableSocket(hSocket)) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
LogPrintf("connection from %s dropped: non-selectable socket\n", addr.ToString()); |
|
|
|
|
|
|
|
CloseSocket(hSocket); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else if (nInbound >= nMaxInbound) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
LogPrint("net", "connection from %s dropped (full)\n", addr.ToString()); |
|
|
|
|
|
|
|
CloseSocket(hSocket); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else if (!whitelisted && (nInbound >= (nMaxInbound - nWhiteConnections))) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
LogPrint("net", "connection from %s dropped (non-whitelisted)\n", addr.ToString()); |
|
|
|
|
|
|
|
CloseSocket(hSocket); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else if (CNode::IsBanned(addr) && !whitelisted) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
LogPrintf("connection from %s dropped (banned)\n", addr.ToString()); |
|
|
|
|
|
|
|
CloseSocket(hSocket); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
CNode* pnode = new CNode(hSocket, addr, "", true); |
|
|
|
|
|
|
|
pnode->AddRef(); |
|
|
|
|
|
|
|
pnode->fWhitelisted = whitelisted; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LogPrint("net", "connection from %s accepted\n", addr.ToString()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
LOCK(cs_vNodes); |
|
|
|
|
|
|
|
vNodes.push_back(pnode); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|