OpenTTD Source  12.0-beta2
TCPConnecter Class Reference

"Helper" class for creating TCP connections in a non-blocking manner More...

#include <tcp.h>

Inheritance diagram for TCPConnecter:
NetworkContentConnecter NetworkCoordinatorConnecter NetworkDirectConnecter NetworkHTTPContentConnecter NetworkReuseStunConnecter NetworkStunConnecter NetworkTurnConnecter TCPNetworkDebugConnecter TCPServerConnecter

Public Member Functions

 TCPConnecter (const std::string &connection_string, uint16 default_port, NetworkAddress bind_address={}, int family=AF_UNSPEC)
 Create a new connecter for the given address. More...
 
virtual void OnConnect (SOCKET s)
 Callback when the connection succeeded. More...
 
virtual void OnFailure ()
 Callback for when the connection attempt failed.
 
void Kill ()
 Kill this connecter. More...
 

Static Public Member Functions

static void CheckCallbacks ()
 Check whether we need to call the callback, i.e. More...
 
static void KillAll ()
 Kill all connection attempts.
 

Private Types

enum  Status {
  Status::INIT, Status::RESOLVING, Status::FAILURE, Status::CONNECTING,
  Status::CONNECTED
}
 The current status of the connecter. More...
 

Private Member Functions

void Resolve ()
 Start resolving the hostname. More...
 
void OnResolved (addrinfo *ai)
 Callback when resolving is done. More...
 
bool TryNextAddress ()
 Start the connect() for the next address in the list. More...
 
void Connect (addrinfo *address)
 Start a connection to the indicated address. More...
 
virtual bool CheckActivity ()
 Check if there was activity for this connecter. More...
 

Static Private Member Functions

static void ResolveThunk (TCPConnecter *connecter)
 Thunk to start Resolve() on the right instance.
 

Private Attributes

std::thread resolve_thread
 Thread used during resolving.
 
std::atomic< Statusstatus = Status::INIT
 The current status of the connecter.
 
std::atomic< bool > killed = false
 Whether this connecter is marked as killed.
 
addrinfo * ai = nullptr
 getaddrinfo() allocated linked-list of resolved addresses.
 
std::vector< addrinfo * > addresses
 Addresses we can connect to.
 
std::map< SOCKET, NetworkAddresssock_to_address
 Mapping of a socket to the real address it is connecting to. USed for DEBUG statements.
 
size_t current_address = 0
 Current index in addresses we are trying.
 
std::vector< SOCKET > sockets
 Pending connect() attempts.
 
std::chrono::steady_clock::time_point last_attempt
 Time we last tried to connect.
 
std::string connection_string
 Current address we are connecting to (before resolving).
 
NetworkAddress bind_address
 Address we're binding to, if any.
 
int family = AF_UNSPEC
 Family we are using to connect with.
 

Friends

class TCPServerConnecter
 

Detailed Description

"Helper" class for creating TCP connections in a non-blocking manner

Definition at line 71 of file tcp.h.

Member Enumeration Documentation

◆ Status

enum TCPConnecter::Status
strongprivate

The current status of the connecter.

We track the status like this to ensure everything is executed from the game-thread, and not at another random time where we might not have the lock on the game-state.

Enumerator
INIT 

TCPConnecter is created but resolving hasn't started.

RESOLVING 

The hostname is being resolved (threaded).

FAILURE 

Resolving failed.

CONNECTING 

We are currently connecting.

CONNECTED 

The connection is established.

Definition at line 80 of file tcp.h.

Constructor & Destructor Documentation

◆ TCPConnecter()

TCPConnecter::TCPConnecter ( const std::string &  connection_string,
uint16  default_port,
NetworkAddress  bind_address = {},
int  family = AF_UNSPEC 
)

Create a new connecter for the given address.

Parameters
connection_stringThe address to connect to.
default_portIf not indicated in connection_string, what port to use.
bind_addressThe local bind address to use. Defaults to letting the OS find one.

Definition at line 32 of file tcp_connect.cpp.

References _tcp_connecters, connection_string, and NormalizeConnectionString().

Member Function Documentation

◆ CheckActivity()

bool TCPConnecter::CheckActivity ( )
privatevirtual

◆ CheckCallbacks()

void TCPConnecter::CheckCallbacks ( )
static

Check whether we need to call the callback, i.e.

whether we have connected or aborted and call the appropriate callback for that. It's done this way to ease on the locking that would otherwise be needed everywhere.

Definition at line 468 of file tcp_connect.cpp.

References _tcp_connecters, and CheckActivity().

Referenced by NetworkBackgroundLoop().

◆ Connect()

void TCPConnecter::Connect ( addrinfo *  address)
private

◆ Kill()

◆ OnConnect()

virtual void TCPConnecter::OnConnect ( SOCKET  s)
inlinevirtual

◆ OnResolved()

void TCPConnecter::OnResolved ( addrinfo *  ai)
private

Callback when resolving is done.

Parameters
aiA linked-list of address information.

Definition at line 155 of file tcp_connect.cpp.

References addresses, ai, and family.

Referenced by Resolve().

◆ Resolve()

void TCPConnecter::Resolve ( )
private

Start resolving the hostname.

This function must change "status" to either Status::FAILURE or Status::CONNECTING before returning.

Definition at line 223 of file tcp_connect.cpp.

References ai, CONNECTING, connection_string, Debug, error(), FAILURE, NetworkAddress::GetHostname(), NetworkAddress::GetPort(), lastof, OnResolved(), ParseConnectionString(), seprintf(), and status.

Referenced by CheckActivity(), and ResolveThunk().

◆ TryNextAddress()

bool TCPConnecter::TryNextAddress ( )
private

Start the connect() for the next address in the list.

Returns
True iff a new connect() is attempted.

Definition at line 141 of file tcp_connect.cpp.

References addresses, Connect(), current_address, and last_attempt.

Referenced by CheckActivity().


The documentation for this class was generated from the following files: