From 7b31bea75b0c5b9fe127ea6d845e48a3f87d480f Mon Sep 17 00:00:00 2001 From: Florent Le Coz Date: Tue, 27 May 2014 23:46:18 +0200 Subject: Only close/unmanage the socket if we are connected/connecting Since the socket is now only created and managed whenever the connection is being established, we only close the socket and if it was created (we use -1 to denote the fact that is not yet created, or has been closed) and we only unmanage the socket if it is effectively managed. fix #2529 --- src/network/socket_handler.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/network/socket_handler.cpp b/src/network/socket_handler.cpp index 3d79290..2baad3d 100644 --- a/src/network/socket_handler.cpp +++ b/src/network/socket_handler.cpp @@ -24,6 +24,7 @@ using namespace std::string_literals; #endif SocketHandler::SocketHandler(std::shared_ptr poller): + socket(-1), poller(poller), connected(false), connecting(false) @@ -33,7 +34,7 @@ SocketHandler::SocketHandler(std::shared_ptr poller): void SocketHandler::init_socket(const struct addrinfo* rp) { if ((this->socket = ::socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol)) == -1) - throw std::runtime_error("Could not create socket"); + throw std::runtime_error("Could not create socket: "s + strerror(errno)); int optval = 1; if (::setsockopt(this->socket, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof(optval)) == -1) log_warning("Failed to enable TCP keepalive on socket: " << strerror(errno)); @@ -230,13 +231,18 @@ void SocketHandler::on_send() void SocketHandler::close() { + if (this->connected || this->connecting) + this->poller->remove_socket_handler(this->get_socket()); + if (this->socket != -1) + { + ::close(this->socket); + this->socket = -1; + } this->connected = false; this->connecting = false; this->in_buf.clear(); this->out_buf.clear(); this->port.clear(); - this->poller->remove_socket_handler(this->get_socket()); - ::close(this->socket); } socket_t SocketHandler::get_socket() const -- cgit v1.2.3