| 858 | static list<CNode*> vNodesDisconnected; |
| 859 | |
| 860 | static void AcceptConnection(const ListenSocket& hListenSocket) { |
| 861 | |
| 862 | struct sockaddr_storage sockaddr; |
| 863 | socklen_t len = sizeof(sockaddr); |
| 864 | SOCKET hSocket = accept(hListenSocket.socket, (struct sockaddr *) &sockaddr, &len); |
| 865 | CAddress addr; |
| 866 | int nInbound = 0; |
| 867 | int nMaxOutbound = 0; |
| 868 | int nMaxInbound = nMaxConnections - (nMaxOutbound); |
| 869 | |
| 870 | if (hSocket != INVALID_SOCKET) |
| 871 | if (!addr.SetSockAddr((const struct sockaddr *) &sockaddr)) |
| 872 | LogPrintf("Warning: Unknown socket family\n"); |
| 873 | |
| 874 | bool whitelisted = hListenSocket.whitelisted || CNode::IsWhitelistedRange(addr); |
| 875 | |
| 876 | vector<CNode*> vNodesCopy; |
| 877 | { |
| 878 | LOCK(cs_vNodes); |
| 879 | vNodesCopy = vNodes; |
| 880 | } |
| 881 | |
| 882 | for (CNode *pnode : vNodesCopy) |
| 883 | if (pnode && pnode->fInbound) |
| 884 | nInbound++; |
| 885 | |
| 886 | if (hSocket == INVALID_SOCKET) { |
| 887 | int nErr = WSAGetLastError(); |
| 888 | if (nErr != WSAEWOULDBLOCK) |
| 889 | LogPrintf("socket error accept failed: %s\n", NetworkErrorString(nErr)); |
| 890 | return; |
| 891 | } |
| 892 | |
| 893 | if (!IsSelectableSocket(hSocket)) { |
| 894 | LogPrintf("connection from %s dropped: non-selectable socket\n", addr.ToString()); |
| 895 | CloseSocket(hSocket); |
| 896 | return; |
| 897 | } |
| 898 | |
| 899 | if (CNode::IsBanned(addr) && !whitelisted) { |
| 900 | LogPrintf("connection from %s dropped (banned)\n", addr.ToString()); |
| 901 | CloseSocket(hSocket); |
| 902 | return; |
| 903 | } |
| 904 | |
| 905 | if (nInbound >= nMaxInbound) { |
| 906 | LogPrint("net", "connection from %s dropped (full)\n", addr.ToString()); |
| 907 | CloseSocket(hSocket); |
| 908 | return; |
| 909 | } |
| 910 | |
| 911 | if (nInbound >= nMaxConnections - MAX_OUTBOUND_CONNECTIONS) { |
| 912 | LogPrint("net", "connection from %s dropped (full)\n", addr.ToString()); |
| 913 | CloseSocket(hSocket); |
| 914 | return; |
| 915 | } |
| 916 | |
| 917 | if (!fNetworkActive) { |
no test coverage detected