diff --git a/src/json_rpc_request.cpp b/src/json_rpc_request.cpp index 2a2cb4d..7ed54d2 100644 --- a/src/json_rpc_request.cpp +++ b/src/json_rpc_request.cpp @@ -216,8 +216,10 @@ void JSONRPCRequest::on_read(const char* data, size_t size) void JSONRPCRequest::close() { - uv_tcp_t* s = &m_socket; - uv_close(reinterpret_cast(s), on_close); + uv_handle_t* h = reinterpret_cast(&m_socket); + if (!uv_is_closing(h)) { + uv_close(h, on_close); + } } void JSONRPCRequest::on_close(uv_handle_t* handle) diff --git a/src/tcp_server.inl b/src/tcp_server.inl index 6ecc1b3..aa438b0 100644 --- a/src/tcp_server.inl +++ b/src/tcp_server.inl @@ -385,10 +385,16 @@ void TCPServer::close_sockets(bool listen_sockets if (listen_sockets) { for (uv_tcp_t* s : m_listenSockets6) { - uv_close(reinterpret_cast(s), [](uv_handle_t* h) { delete reinterpret_cast(h); }); + uv_handle_t* h = reinterpret_cast(s); + if (!uv_is_closing(h)) { + uv_close(h, [](uv_handle_t* h) { delete reinterpret_cast(h); }); + } } for (uv_tcp_t* s : m_listenSockets) { - uv_close(reinterpret_cast(s), [](uv_handle_t* h) { delete reinterpret_cast(h); }); + uv_handle_t* h = reinterpret_cast(s); + if (!uv_is_closing(h)) { + uv_close(h, [](uv_handle_t* h) { delete reinterpret_cast(h); }); + } } } @@ -621,7 +627,10 @@ void TCPServer::on_connect(uv_connect_t* req, int LOGWARN(5, "failed to connect to " << static_cast(client->m_addrString) << ", error " << uv_err_name(status)); } server->on_connect_failed(client->m_isV6, client->m_addr, client->m_port); - uv_close(reinterpret_cast(&client->m_socket), nullptr); + uv_handle_t* h = reinterpret_cast(&client->m_socket); + if (!uv_is_closing(h)) { + uv_close(h, nullptr); + } server->m_preallocatedClients.push_back(client); return; }