diff --git a/src/net.cpp b/src/net.cpp index 610a795c64a..652bdb36b64 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -1502,28 +1502,33 @@ void CConnman::SocketEvents(const std::vector& nodes, void CConnman::SocketHandler() { - const NodesSnapshot snap{*this, /*shuffle=*/false}; + std::set recv_set; + std::set send_set; + std::set error_set; - std::set recv_set, send_set, error_set; - SocketEvents(snap.Nodes(), recv_set, send_set, error_set); - - if (interruptNet) return; - - // - // Accept new connections - // - for (const ListenSocket& hListenSocket : vhListenSocket) { - if (hListenSocket.socket != INVALID_SOCKET && recv_set.count(hListenSocket.socket) > 0) - { - AcceptConnection(hListenSocket); - } + const NodesSnapshot snap{*this, /*shuffle=*/false}; + + // Check for the readiness of the already connected sockets and the + // listening sockets in one call ("readiness" as in poll(2) or + // select(2)). If none are ready, wait for a short while and return + // empty sets. + SocketEvents(snap.Nodes(), recv_set, send_set, error_set); + + // Service (send/receive) each of the already connected nodes. + SocketHandlerConnected(snap.Nodes(), recv_set, send_set, error_set); } - // - // Service each socket - // - for (CNode* pnode : snap.Nodes()) { + // Accept new connections from listening sockets. + SocketHandlerListening(recv_set); +} + +void CConnman::SocketHandlerConnected(const std::vector& nodes, + const std::set& recv_set, + const std::set& send_set, + const std::set& error_set) +{ + for (CNode* pnode : nodes) { if (interruptNet) return; @@ -1607,6 +1612,18 @@ void CConnman::SocketHandler() } } +void CConnman::SocketHandlerListening(const std::set& recv_set) +{ + for (const ListenSocket& listen_socket : vhListenSocket) { + if (interruptNet) { + return; + } + if (listen_socket.socket != INVALID_SOCKET && recv_set.count(listen_socket.socket) > 0) { + AcceptConnection(listen_socket); + } + } +} + void CConnman::ThreadSocketHandler() { SetSyscallSandboxPolicy(SyscallSandboxPolicy::NET); diff --git a/src/net.h b/src/net.h index f03883ca544..e8de0265730 100644 --- a/src/net.h +++ b/src/net.h @@ -1010,7 +1010,30 @@ private: std::set& send_set, std::set& error_set); + /** + * Check connected and listening sockets for IO readiness and process them accordingly. + */ void SocketHandler(); + + /** + * Do the read/write for connected sockets that are ready for IO. + * @param[in] nodes Nodes to process. The socket of each node is checked against + * `recv_set`, `send_set` and `error_set`. + * @param[in] recv_set Sockets that are ready for read. + * @param[in] send_set Sockets that are ready for send. + * @param[in] error_set Sockets that have an exceptional condition (error). + */ + void SocketHandlerConnected(const std::vector& nodes, + const std::set& recv_set, + const std::set& send_set, + const std::set& error_set); + + /** + * Accept incoming connections, one from each read-ready listening socket. + * @param[in] recv_set Sockets that are ready for read. + */ + void SocketHandlerListening(const std::set& recv_set); + void ThreadSocketHandler(); void ThreadDNSAddressSeed();