summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorent Le Coz <louiz@louiz.org>2014-05-27 23:46:18 +0200
committerFlorent Le Coz <louiz@louiz.org>2014-05-27 23:47:45 +0200
commit7b31bea75b0c5b9fe127ea6d845e48a3f87d480f (patch)
tree8c13f12f512d5cd72784132a644ca819694b6808
parent34739728f930f461ae6763a5f144f709a9919e59 (diff)
downloadbiboumi-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
-rw-r--r--src/network/socket_handler.cpp12
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