Commit 8b30e312 authored by louiz’'s avatar louiz’

Add a TimedEvent to cancel the connection to a server after 5 seconds

parent 349dc06e
#include <network/socket_handler.hpp> #include <network/socket_handler.hpp>
#include <utils/timed_events.hpp>
#include <utils/scopeguard.hpp> #include <utils/scopeguard.hpp>
#include <network/poller.hpp> #include <network/poller.hpp>
...@@ -26,6 +27,7 @@ ...@@ -26,6 +27,7 @@
#endif #endif
using namespace std::string_literals; using namespace std::string_literals;
using namespace std::chrono_literals;
namespace ph = std::placeholders; namespace ph = std::placeholders;
...@@ -117,6 +119,8 @@ void SocketHandler::connect(const std::string& address, const std::string& port, ...@@ -117,6 +119,8 @@ void SocketHandler::connect(const std::string& address, const std::string& port,
|| errno == EISCONN) || errno == EISCONN)
{ {
log_info("Connection success."); log_info("Connection success.");
TimedEventsManager::instance().cancel("connection_timeout"s +
std::to_string(this->socket));
this->poller->add_socket_handler(this); this->poller->add_socket_handler(this);
this->connected = true; this->connected = true;
this->connecting = false; this->connecting = false;
...@@ -139,6 +143,12 @@ void SocketHandler::connect(const std::string& address, const std::string& port, ...@@ -139,6 +143,12 @@ void SocketHandler::connect(const std::string& address, const std::string& port,
memcpy(&this->addrinfo, rp, sizeof(struct addrinfo)); memcpy(&this->addrinfo, rp, sizeof(struct addrinfo));
this->addrinfo.ai_addr = &this->ai_addr; this->addrinfo.ai_addr = &this->ai_addr;
this->addrinfo.ai_next = nullptr; this->addrinfo.ai_next = nullptr;
// If the connection has not succeeded or failed in 5s, we consider
// it to have failed
TimedEventsManager::instance().add_event(
TimedEvent(std::chrono::steady_clock::now() + 5s,
std::bind(&SocketHandler::on_connection_timeout, this),
"connection_timeout"s + std::to_string(this->socket)));
return ; return ;
} }
log_info("Connection failed:" << strerror(errno)); log_info("Connection failed:" << strerror(errno));
...@@ -149,6 +159,12 @@ void SocketHandler::connect(const std::string& address, const std::string& port, ...@@ -149,6 +159,12 @@ void SocketHandler::connect(const std::string& address, const std::string& port,
return ; return ;
} }
void SocketHandler::on_connection_timeout()
{
this->close();
this->on_connection_failed("connection timed out");
}
void SocketHandler::connect() void SocketHandler::connect()
{ {
this->connect(this->address, this->port, this->use_tls); this->connect(this->address, this->port, this->use_tls);
...@@ -273,6 +289,8 @@ void SocketHandler::close() ...@@ -273,6 +289,8 @@ void SocketHandler::close()
this->in_buf.clear(); this->in_buf.clear();
this->out_buf.clear(); this->out_buf.clear();
this->port.clear(); this->port.clear();
TimedEventsManager::instance().cancel("connection_timeout"s +
std::to_string(this->socket));
} }
socket_t SocketHandler::get_socket() const socket_t SocketHandler::get_socket() const
......
...@@ -85,6 +85,11 @@ public: ...@@ -85,6 +85,11 @@ public:
* Close the connection, remove us from the poller * Close the connection, remove us from the poller
*/ */
void close(); void close();
/**
* Called by a TimedEvent, when the connection did not succeed or fail
* after a given time.
*/
void on_connection_timeout();
/** /**
* Called when the connection is successful. * Called when the connection is successful.
*/ */
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment