diff --git a/src/net.h b/src/net.h --- a/src/net.h +++ b/src/net.h @@ -372,6 +372,8 @@ bool GenerateSelectSet(std::set &recv_set, std::set &send_set, std::set &error_set); + void SocketEvents(std::set &recv_set, std::set &send_set, + std::set &error_set); void SocketHandler(); void ThreadSocketHandler(); void ThreadDNSAddressSeed(); diff --git a/src/net.cpp b/src/net.cpp --- a/src/net.cpp +++ b/src/net.cpp @@ -1266,7 +1266,9 @@ return !recv_set.empty() || !send_set.empty() || !error_set.empty(); } -void CConnman::SocketHandler() { +void CConnman::SocketEvents(std::set &recv_set, + std::set &send_set, + std::set &error_set) { std::set recv_select_set, send_select_set, error_select_set; if (!GenerateSelectSet(recv_select_set, send_select_set, error_select_set)) { @@ -1327,12 +1329,39 @@ } } + for (SOCKET hSocket : recv_select_set) { + if (FD_ISSET(hSocket, &fdsetRecv)) { + recv_set.insert(hSocket); + } + } + + for (SOCKET hSocket : send_select_set) { + if (FD_ISSET(hSocket, &fdsetSend)) { + send_set.insert(hSocket); + } + } + + for (SOCKET hSocket : error_select_set) { + if (FD_ISSET(hSocket, &fdsetError)) { + error_set.insert(hSocket); + } + } +} + +void CConnman::SocketHandler() { + std::set recv_set, send_set, error_set; + SocketEvents(recv_set, send_set, error_set); + + if (interruptNet) { + return; + } + // // Accept new connections // for (const ListenSocket &hListenSocket : vhListenSocket) { if (hListenSocket.socket != INVALID_SOCKET && - FD_ISSET(hListenSocket.socket, &fdsetRecv)) { + recv_set.count(hListenSocket.socket) > 0) { AcceptConnection(hListenSocket); } } @@ -1364,9 +1393,9 @@ if (pnode->hSocket == INVALID_SOCKET) { continue; } - recvSet = FD_ISSET(pnode->hSocket, &fdsetRecv); - sendSet = FD_ISSET(pnode->hSocket, &fdsetSend); - errorSet = FD_ISSET(pnode->hSocket, &fdsetError); + recvSet = recv_set.count(pnode->hSocket) > 0; + sendSet = send_set.count(pnode->hSocket) > 0; + errorSet = error_set.count(pnode->hSocket) > 0; } if (recvSet || errorSet) { // typical socket buffer is 8K-64K