diff options
author | Florent Le Coz <louiz@louiz.org> | 2014-05-27 23:46:18 +0200 |
---|---|---|
committer | Florent Le Coz <louiz@louiz.org> | 2014-05-27 23:47:45 +0200 |
commit | 7b31bea75b0c5b9fe127ea6d845e48a3f87d480f (patch) | |
tree | 8c13f12f512d5cd72784132a644ca819694b6808 /src/network | |
parent | 34739728f930f461ae6763a5f144f709a9919e59 (diff) | |
download | biboumi-7b31bea75b0c5b9fe127ea6d845e48a3f87d480f.tar.gz biboumi-7b31bea75b0c5b9fe127ea6d845e48a3f87d480f.tar.bz2 biboumi-7b31bea75b0c5b9fe127ea6d845e48a3f87d480f.tar.xz biboumi-7b31bea75b0c5b9fe127ea6d845e48a3f87d480f.zip |
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
Diffstat (limited to 'src/network')
-rw-r--r-- | src/network/socket_handler.cpp | 12 |
1 files 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> poller): + socket(-1), poller(poller), connected(false), connecting(false) @@ -33,7 +34,7 @@ SocketHandler::SocketHandler(std::shared_ptr<Poller> 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 |