Files
biboumi/louloulibs/network/tcp_client_socket_handler.hpp
T
louiz’ 0c8adc85f7 Move all the connect() logic from TCPSocketHandler into a subclass
This way, TCPSocketHandler only deal with the message sending/receiving, not
the connect() or anything else.  This will be used for implementing servers
(because when a client is accepted, we don’t need all the connect() and dns
resolution stuff).
2016-11-11 02:54:48 +01:00

76 lines
1.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#pragma once
#include <network/tcp_socket_handler.hpp>
class TCPClientSocketHandler: public TCPSocketHandler
{
public:
TCPClientSocketHandler(std::shared_ptr<Poller> poller);
~TCPClientSocketHandler();
/**
* Connect to the remote server, and call on_connected() if this
* succeeds. If tls is true, we set use_tls to true and will also call
* start_tls() when the connection succeeds.
*/
void connect(const std::string& address, const std::string& port, const bool tls);
void connect() override final;
/**
* 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;
bool is_connected() const override;
bool is_connecting() const;
std::string get_port() const;
void close() override final;
std::chrono::system_clock::time_point connection_date;
protected:
bool hostname_resolution_failed;
/**
* Address to bind the socket to, before calling connect().
* If empty, it’s equivalent to binding to INADDR_ANY.
*/
std::string bind_addr;
/**
* Display the resolved IP, just for information purpose.
*/
void display_resolved_ip(struct addrinfo* rp) const;
private:
/**
* Initialize the socket with the parameters contained in the given
* addrinfo structure.
*/
void init_socket(const struct addrinfo* rp);
/**
* DNS resolver
*/
Resolver resolver;
/**
* Keep the details of the addrinfo returned by the resolver that
* triggered a EINPROGRESS error when connect()ing to it, to reuse it
* directly when connect() is called again.
*/
struct addrinfo addrinfo;
struct sockaddr_in6 ai_addr;
socklen_t ai_addrlen;
/**
* Hostname we are connected/connecting to
*/
std::string address;
/**
* Port we are connected/connecting to
*/
std::string port;
bool connected;
bool connecting;
};