OpenTTD
Public Member Functions | Static Public Member Functions | Private Types | Private Member Functions | Private Attributes
NetworkAddress Class Reference

Wrapper for (un)resolved network addresses; there's no reason to transform a numeric IP to a string and then back again to pass it to functions. More...

#include <address.h>

Inheritance diagram for NetworkAddress:
NetworkUDPQueryServerInfo

Public Member Functions

 NetworkAddress (struct sockaddr_storage &address, int address_length)
 Create a network address based on a resolved IP and port. More...
 
 NetworkAddress (sockaddr *address, int address_length)
 Create a network address based on a resolved IP and port. More...
 
 NetworkAddress (const char *hostname="", uint16 port=0, int family=AF_UNSPEC)
 Create a network address based on a unresolved host and port. More...
 
 NetworkAddress (const NetworkAddress &address)
 Make a clone of another address. More...
 
const char * GetHostname ()
 Get the hostname; in case it wasn't given the IPv4 dotted representation is given. More...
 
void GetAddressAsString (char *buffer, const char *last, bool with_family=true)
 Get the address as a string, e.g. More...
 
const char * GetAddressAsString (bool with_family=true)
 Get the address as a string, e.g. More...
 
const sockaddr_storage * GetAddress ()
 Get the address in its internal representation. More...
 
int GetAddressLength ()
 Get the (valid) length of the address. More...
 
uint16 GetPort () const
 Get the port. More...
 
void SetPort (uint16 port)
 Set the port. More...
 
bool IsResolved () const
 Check whether the IP address has been resolved already. More...
 
bool IsFamily (int family)
 Checks of this address is of the given family. More...
 
bool IsInNetmask (char *netmask)
 Checks whether this IP address is contained by the given netmask. More...
 
int CompareTo (NetworkAddress &address)
 Compare the address of this class with the address of another. More...
 
bool operator== (NetworkAddress &address)
 Compare the address of this class with the address of another. More...
 
bool operator== (NetworkAddress &address) const
 Compare the address of this class with the address of another. More...
 
bool operator!= (NetworkAddress address) const
 Compare the address of this class with the address of another. More...
 
bool operator< (NetworkAddress &address)
 Compare the address of this class with the address of another. More...
 
SOCKET Connect ()
 Connect to the given address. More...
 
void Listen (int socktype, SocketList *sockets)
 Make the given socket listen. More...
 

Static Public Member Functions

static const char * SocketTypeAsString (int socktype)
 Convert the socket type into a string. More...
 
static const char * AddressFamilyAsString (int family)
 Convert the address family into a string. More...
 

Private Types

typedef SOCKET(* LoopProc) (addrinfo *runp)
 Helper function to resolve something to a socket. More...
 

Private Member Functions

SOCKET Resolve (int family, int socktype, int flags, SocketList *sockets, LoopProc func)
 Resolve this address into a socket. More...
 

Private Attributes

char hostname [NETWORK_HOSTNAME_LENGTH]
 The hostname.
 
int address_length
 The length of the resolved address.
 
sockaddr_storage address
 The resolved address.
 
bool resolved
 Whether the address has been (tried to be) resolved.
 

Detailed Description

Wrapper for (un)resolved network addresses; there's no reason to transform a numeric IP to a string and then back again to pass it to functions.

It furthermore allows easier delaying of the hostname lookup.

Definition at line 31 of file address.h.

Member Typedef Documentation

◆ LoopProc

typedef SOCKET(* NetworkAddress::LoopProc) (addrinfo *runp)
private

Helper function to resolve something to a socket.

Parameters
runpinformation about the socket to try not
Returns
the opened socket or INVALID_SOCKET

Definition at line 43 of file address.h.

Constructor & Destructor Documentation

◆ NetworkAddress() [1/4]

NetworkAddress::NetworkAddress ( struct sockaddr_storage &  address,
int  address_length 
)
inline

Create a network address based on a resolved IP and port.

Parameters
addressThe IP address with port.
address_lengthThe length of the address.

Definition at line 52 of file address.h.

Referenced by ConnectLoopProc(), IsInNetmask(), and ListenLoopProc().

◆ NetworkAddress() [2/4]

NetworkAddress::NetworkAddress ( sockaddr *  address,
int  address_length 
)
inline

Create a network address based on a resolved IP and port.

Parameters
addressThe IP address with port.
address_lengthThe length of the address.

Definition at line 65 of file address.h.

◆ NetworkAddress() [3/4]

NetworkAddress::NetworkAddress ( const char *  hostname = "",
uint16  port = 0,
int  family = AF_UNSPEC 
)
inline

Create a network address based on a unresolved host and port.

Parameters
hostnamethe unresolved hostname
portthe port
familythe address family

Definition at line 80 of file address.h.

References lastof, SetPort(), strecpy(), and StrEmpty().

◆ NetworkAddress() [4/4]

NetworkAddress::NetworkAddress ( const NetworkAddress address)
inline

Make a clone of another address.

Parameters
addressthe address to clone

Definition at line 100 of file address.h.

References GetAddress(), GetAddressAsString(), and GetHostname().

Member Function Documentation

◆ AddressFamilyAsString()

const char * NetworkAddress::AddressFamilyAsString ( int  family)
static

Convert the address family into a string.

Parameters
familythe family to convert
Returns
the string representation
Note
only works for AF_INET, AF_INET6 and AF_UNSPEC

Definition at line 427 of file address.cpp.

Referenced by ConnectLoopProc(), ListenLoopProc(), operator<(), MasterNetworkUDPSocketHandler::Receive_MASTER_ACK_REGISTER(), MasterNetworkUDPSocketHandler::Receive_MASTER_SESSION_KEY(), and Resolve().

◆ CompareTo()

int NetworkAddress::CompareTo ( NetworkAddress address)
inline

Compare the address of this class with the address of another.

Parameters
addressthe other address.
Returns
< 0 if address is less, 0 if equal and > 0 if address is more

Definition at line 141 of file address.h.

References address, GetAddressLength(), and GetPort().

Referenced by operator!=(), operator<(), and operator==().

◆ Connect()

SOCKET NetworkAddress::Connect ( )

Connect to the given address.

Returns
the connected socket or INVALID_SOCKET.

Definition at line 325 of file address.cpp.

References ConnectLoopProc(), DEBUG, GetAddressAsString(), and Resolve().

Referenced by TCPConnecter::Connect(), and operator<().

◆ GetAddress()

const sockaddr_storage * NetworkAddress::GetAddress ( )

◆ GetAddressAsString() [1/2]

void NetworkAddress::GetAddressAsString ( char *  buffer,
const char *  last,
bool  with_family = true 
)

◆ GetAddressAsString() [2/2]

const char * NetworkAddress::GetAddressAsString ( bool  with_family = true)

Get the address as a string, e.g.

127.0.0.1:12345.

Parameters
with_familywhether to add the family (e.g. IPvX).
Returns
the address
Note
NOT thread safe

Definition at line 105 of file address.cpp.

References GetAddressAsString(), lastof, and NETWORK_HOSTNAME_LENGTH.

◆ GetAddressLength()

int NetworkAddress::GetAddressLength ( )
inline

Get the (valid) length of the address.

Returns
the length

Definition at line 114 of file address.h.

References address_length, GetAddress(), GetPort(), IsResolved(), and SetPort().

Referenced by CompareTo(), IsInNetmask(), and NetworkUDPSocketHandler::SendPacket().

◆ GetHostname()

const char * NetworkAddress::GetHostname ( )

◆ GetPort()

uint16 NetworkAddress::GetPort ( ) const

Get the port.

Returns
the port.

Definition at line 39 of file address.cpp.

References address.

Referenced by CompareTo(), GetAddressAsString(), GetAddressLength(), and Resolve().

◆ IsFamily()

bool NetworkAddress::IsFamily ( int  family)

Checks of this address is of the given family.

Parameters
familythe family to check against
Returns
true if it is of the given family

Definition at line 147 of file address.cpp.

References address, IsResolved(), Resolve(), and ResolveLoopProc().

Referenced by IsResolved(), and NetworkUDPSocketHandler::SendPacket().

◆ IsInNetmask()

bool NetworkAddress::IsInNetmask ( char *  netmask)

Checks whether this IP address is contained by the given netmask.

Parameters
netmaskthe netmask in CIDR notation to test against.
Note
netmask without /n assumes all bits need to match.
Returns
true if this IP is within the netmask.

Definition at line 161 of file address.cpp.

References address, GetAddress(), GetAddressLength(), IsResolved(), and NetworkAddress().

Referenced by TCPListenHandler< ServerNetworkGameSocketHandler, PACKET_SERVER_FULL, PACKET_SERVER_BANNED >::AcceptClient(), and IsResolved().

◆ IsResolved()

bool NetworkAddress::IsResolved ( ) const
inline

Check whether the IP address has been resolved already.

Returns
true iff the port has been resolved

Definition at line 128 of file address.h.

References IsFamily(), IsInNetmask(), and resolved.

Referenced by GetAddress(), GetAddressLength(), IsFamily(), IsInNetmask(), and NetworkUDPQueryServer().

◆ Listen()

void NetworkAddress::Listen ( int  socktype,
SocketList sockets 
)

Make the given socket listen.

Parameters
socktypethe type of socket (TCP, UDP, etc)
socketsthe list of sockets to add the sockets to

Definition at line 390 of file address.cpp.

Referenced by operator<().

◆ operator!=()

bool NetworkAddress::operator!= ( NetworkAddress  address) const
inline

Compare the address of this class with the address of another.

Parameters
addressthe other address.
Returns
true if both do not match.

Definition at line 174 of file address.h.

References CompareTo().

◆ operator<()

bool NetworkAddress::operator< ( NetworkAddress address)
inline

Compare the address of this class with the address of another.

Parameters
addressthe other address.

Definition at line 183 of file address.h.

References AddressFamilyAsString(), CompareTo(), Connect(), Listen(), and SocketTypeAsString().

◆ operator==() [1/2]

bool NetworkAddress::operator== ( NetworkAddress address)
inline

Compare the address of this class with the address of another.

Parameters
addressthe other address.
Returns
true if both match.

Definition at line 155 of file address.h.

References CompareTo().

◆ operator==() [2/2]

bool NetworkAddress::operator== ( NetworkAddress address) const
inline

Compare the address of this class with the address of another.

Parameters
addressthe other address.
Returns
true if both match.

Definition at line 165 of file address.h.

References CompareTo().

◆ Resolve()

SOCKET NetworkAddress::Resolve ( int  family,
int  socktype,
int  flags,
SocketList sockets,
LoopProc  func 
)
private

Resolve this address into a socket.

Parameters
familythe type of 'protocol' (IPv4, IPv6)
socktypethe type of socket (TCP, UDP, etc)
flagsthe flags to send to getaddrinfo
socketsthe list of sockets to add the sockets to
functhe inner working while looping over the address info
Returns
the resolved socket or INVALID_SOCKET.

Definition at line 224 of file address.cpp.

References address, address_length, AddressFamilyAsString(), SmallMap< T, U, S >::Contains(), DEBUG, FS2OTTD(), GetPort(), hostname, lastof, ResolveLoopProc(), seprintf(), SocketTypeAsString(), strecpy(), and StrEmpty().

Referenced by Connect(), GetAddress(), and IsFamily().

◆ SetPort()

void NetworkAddress::SetPort ( uint16  port)

Set the port.

Parameters
portset the port number.

Definition at line 58 of file address.cpp.

References address.

Referenced by GetAddressLength(), and NetworkAddress().

◆ SocketTypeAsString()

const char * NetworkAddress::SocketTypeAsString ( int  socktype)
static

Convert the socket type into a string.

Parameters
socktypethe socket type to convert
Returns
the string representation
Note
only works for SOCK_STREAM and SOCK_DGRAM

Definition at line 412 of file address.cpp.

Referenced by ConnectLoopProc(), ListenLoopProc(), operator<(), and Resolve().


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