OpenTTD Source  20241109-master-g5e4f8db7d6
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 NetworkReuseStunConnecter NetworkStunConnecter NetworkTurnConnecter TCPServerConnecter TCPClientConnecter TCPQueryConnecter

Public Member Functions

 TCPConnecter (const std::string &connection_string, uint16_t default_port, const NetworkAddress &bind_address={}, int family=AF_UNSPEC)
 Create a new connecter for the given address. More...
 
virtual void OnConnect ([[maybe_unused]] 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.
 
template<class T , typename... Args>
static std::shared_ptr< TCPConnecterCreate (Args &&... args)
 Create the connecter, and initiate connecting by putting it in the collection of TCP connections to make. More...
 

Private Types

enum class  Status {
  Init , Resolving , Failure , Connecting ,
  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.
 

Static Private Attributes

static std::vector< std::shared_ptr< TCPConnecter > > connecters
 List of connections that are currently being created.
 

Friends

class TCPServerConnecter
 

Detailed Description

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

Definition at line 70 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 79 of file tcp.h.

Constructor & Destructor Documentation

◆ TCPConnecter()

TCPConnecter::TCPConnecter ( const std::string &  connection_string,
uint16_t  default_port,
const 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 29 of file tcp_connect.cpp.

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 463 of file tcp_connect.cpp.

References connecters.

Referenced by NetworkBackgroundLoop().

◆ Connect()

void TCPConnecter::Connect ( addrinfo *  address)
private

◆ Create()

template<class T , typename... Args>
static std::shared_ptr<TCPConnecter> TCPConnecter::Create ( Args &&...  args)
inlinestatic

Create the connecter, and initiate connecting by putting it in the collection of TCP connections to make.

Template Parameters
TThe type of connecter to create.
Parameters
argsThe arguments to the constructor of T.
Returns
Shared pointer to the connecter.

Definition at line 145 of file tcp.h.

References connecters.

◆ Kill()

void TCPConnecter::Kill ( )

Kill this connecter.

It will abort as soon as it can and not call any of the callbacks.

Definition at line 78 of file tcp_connect.cpp.

References killed.

◆ OnConnect()

virtual void TCPConnecter::OnConnect ( [[maybe_unused] ] SOCKET  s)
inlinevirtual

Callback when the connection succeeded.

Parameters
sthe socket that we opened

Definition at line 126 of file tcp.h.

Referenced by TCPServerConnecter::CheckActivity().

◆ OnResolved()

void TCPConnecter::OnResolved ( addrinfo *  ai)
private

Callback when resolving is done.

Parameters
aiA linked-list of address information.

Definition at line 148 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 220 of file tcp_connect.cpp.

References ai, Connecting, connection_string, Debug, Failure, NetworkAddress::GetHostname(), NetworkAddress::GetPort(), OnResolved(), ParseConnectionString(), 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 134 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: