Pyrogenesis  trunk
Functions | Variables
StunClient Namespace Reference

Functions

template<typename T , size_t n = sizeof(T)>
void AddToBuffer (std::vector< u8 > &buffer, const T value)
 Push POD data to a network-byte-order buffer. More...
 
template<typename T , size_t n = sizeof(T)>
bool GetFromBuffer (const std::vector< u8 > &buffer, u32 &offset, T &result)
 Read POD data from a network-byte-order buffer. More...
 
void SendStunRequest (ENetHost &transactionHost, ENetAddress addr)
 
bool CreateStunRequest (ENetHost &transactionHost)
 Creates a STUN request and sends it to a STUN server. More...
 
bool ReceiveStunResponse (ENetHost &transactionHost, std::vector< u8 > &buffer)
 Gets the response from the STUN server and checks it for its validity. More...
 
bool ParseStunResponse (const std::vector< u8 > &buffer)
 
bool STUNRequestAndResponse (ENetHost &transactionHost)
 
bool FindPublicIP (ENetHost &transactionHost, CStr &ip, u16 &port)
 
void SendHolePunchingMessages (ENetHost &enetClient, const std::string &serverAddress, u16 serverPort)
 Send a message to the target server with the given ENet host/socket. More...
 
bool FindLocalIP (CStr &ip)
 
bool FindPublicIP (ENetHost &enetClient, CStr8 &ip, u16 &port)
 Return the publicly accessible IP of the given ENet host/socket. More...
 
bool FindLocalIP (CStr8 &ip)
 Return the local IP. More...
 

Variables

const u32 m_MagicCookie = 0x2112A442
 These constants are defined in Section 6 of RFC 5389. More...
 
const u16 m_MethodTypeBinding = 0x01
 
const u32 m_BindingSuccessResponse = 0x0101
 
const u16 m_ComprehensionOptional = 0x1 << 15
 Bit determining whether comprehension of an attribute is optional. More...
 
const u16 m_IETFReview = 0x1 << 14
 Bit determining whether the bit was assigned by IETF Review. More...
 
const u8 m_IPAddressFamilyIPv4 = 0x01
 These constants are defined in Section 15.1 of RFC 5389. More...
 
const u16 m_AttrTypeMappedAddress = 0x001
 These constants are defined in Section 18.2 of RFC 5389. More...
 
const u16 m_AttrTypeXORMappedAddress = 0x0020
 
u8 m_TransactionID [12]
 Described in section 3 of RFC 5389. More...
 
ENetAddress m_StunServer
 
ENetAddress m_PublicAddress
 Public IP + port discovered via the STUN transaction. More...
 

Function Documentation

◆ AddToBuffer()

template<typename T , size_t n = sizeof(T)>
void StunClient::AddToBuffer ( std::vector< u8 > &  buffer,
const T  value 
)

Push POD data to a network-byte-order buffer.

TODO: this should be optimised & moved to byte_order.h

◆ CreateStunRequest()

bool StunClient::CreateStunRequest ( ENetHost transactionHost)

Creates a STUN request and sends it to a STUN server.

The request is sent through transactionHost, from which the answer will be retrieved by ReceiveStunResponse and interpreted by ParseStunResponse.

◆ FindLocalIP() [1/2]

bool StunClient::FindLocalIP ( CStr8 &  ip)

Return the local IP.

Technically not a STUN method, but convenient to define here.

◆ FindLocalIP() [2/2]

bool StunClient::FindLocalIP ( CStr &  ip)

◆ FindPublicIP() [1/2]

bool StunClient::FindPublicIP ( ENetHost enetClient,
CStr8 &  ip,
u16 port 
)

Return the publicly accessible IP of the given ENet host/socket.

This is done by contacting STUN server. The return IP & port should only be considered valid for the give host/socket.

◆ FindPublicIP() [2/2]

bool StunClient::FindPublicIP ( ENetHost transactionHost,
CStr &  ip,
u16 port 
)

◆ GetFromBuffer()

template<typename T , size_t n = sizeof(T)>
bool StunClient::GetFromBuffer ( const std::vector< u8 > &  buffer,
u32 offset,
T result 
)

Read POD data from a network-byte-order buffer.

TODO: this should be optimised & moved to byte_order.h

◆ ParseStunResponse()

bool StunClient::ParseStunResponse ( const std::vector< u8 > &  buffer)

◆ ReceiveStunResponse()

bool StunClient::ReceiveStunResponse ( ENetHost transactionHost,
std::vector< u8 > &  buffer 
)

Gets the response from the STUN server and checks it for its validity.

◆ SendHolePunchingMessages()

void StunClient::SendHolePunchingMessages ( ENetHost enetClient,
const std::string &  serverAddress,
u16  serverPort 
)

Send a message to the target server with the given ENet host/socket.

This will open a port on the local gateway (if any) to receive trafic, allowing the recipient to answer (thus 'punching a hole' in the NAT). NB: this assumes consistent NAT, i.e. the outgoing port is always the same for the given client, thus allowing the IP discovered via STUN to be sent to the target server.

◆ SendStunRequest()

void StunClient::SendStunRequest ( ENetHost transactionHost,
ENetAddress  addr 
)

◆ STUNRequestAndResponse()

bool StunClient::STUNRequestAndResponse ( ENetHost transactionHost)

Variable Documentation

◆ m_AttrTypeMappedAddress

const u16 StunClient::m_AttrTypeMappedAddress = 0x001

These constants are defined in Section 18.2 of RFC 5389.

◆ m_AttrTypeXORMappedAddress

const u16 StunClient::m_AttrTypeXORMappedAddress = 0x0020

◆ m_BindingSuccessResponse

const u32 StunClient::m_BindingSuccessResponse = 0x0101

◆ m_ComprehensionOptional

const u16 StunClient::m_ComprehensionOptional = 0x1 << 15

Bit determining whether comprehension of an attribute is optional.

Described in Section 15 of RFC 5389.

◆ m_IETFReview

const u16 StunClient::m_IETFReview = 0x1 << 14

Bit determining whether the bit was assigned by IETF Review.

Described in section 18.1. of RFC 5389.

◆ m_IPAddressFamilyIPv4

const u8 StunClient::m_IPAddressFamilyIPv4 = 0x01

These constants are defined in Section 15.1 of RFC 5389.

◆ m_MagicCookie

const u32 StunClient::m_MagicCookie = 0x2112A442

These constants are defined in Section 6 of RFC 5389.

◆ m_MethodTypeBinding

const u16 StunClient::m_MethodTypeBinding = 0x01

◆ m_PublicAddress

ENetAddress StunClient::m_PublicAddress

Public IP + port discovered via the STUN transaction.

◆ m_StunServer

ENetAddress StunClient::m_StunServer

◆ m_TransactionID

u8 StunClient::m_TransactionID[12]

Described in section 3 of RFC 5389.