~singpolyma/biboumi

8b30e312bbc0728b527941d5b0a6d0f621025ed0 — Florent Le Coz 9 years ago 349dc06
Add a TimedEvent to cancel the connection to a server after 5 seconds
2 files changed, 23 insertions(+), 0 deletions(-)

M src/network/socket_handler.cpp
M src/network/socket_handler.hpp
M src/network/socket_handler.cpp => src/network/socket_handler.cpp +18 -0
@@ 1,5 1,6 @@
#include <network/socket_handler.hpp>

#include <utils/timed_events.hpp>
#include <utils/scopeguard.hpp>
#include <network/poller.hpp>



@@ 26,6 27,7 @@
#endif

using namespace std::string_literals;
using namespace std::chrono_literals;

namespace ph = std::placeholders;



@@ 117,6 119,8 @@ void SocketHandler::connect(const std::string& address, const std::string& port,
          || errno == EISCONN)
        {
          log_info("Connection success.");
          TimedEventsManager::instance().cancel("connection_timeout"s +
                                                std::to_string(this->socket));
          this->poller->add_socket_handler(this);
          this->connected = true;
          this->connecting = false;


@@ 139,6 143,12 @@ void SocketHandler::connect(const std::string& address, const std::string& port,
          memcpy(&this->addrinfo, rp, sizeof(struct addrinfo));
          this->addrinfo.ai_addr = &this->ai_addr;
          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 ;
        }
      log_info("Connection failed:" << strerror(errno));


@@ 149,6 159,12 @@ void SocketHandler::connect(const std::string& address, const std::string& port,
  return ;
}

void SocketHandler::on_connection_timeout()
{
  this->close();
  this->on_connection_failed("connection timed out");
}

void SocketHandler::connect()
{
  this->connect(this->address, this->port, this->use_tls);


@@ 273,6 289,8 @@ void SocketHandler::close()
  this->in_buf.clear();
  this->out_buf.clear();
  this->port.clear();
  TimedEventsManager::instance().cancel("connection_timeout"s +
                                        std::to_string(this->socket));
}

socket_t SocketHandler::get_socket() const

M src/network/socket_handler.hpp => src/network/socket_handler.hpp +5 -0
@@ 86,6 86,11 @@ public:
   */
  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.
   */
  virtual void on_connected() = 0;