#include <pstun.h>
Inheritance diagram for PSTUNClient:
Public Types | |
enum | { DefaultPort = 3478 } |
enum | NatTypes { UnknownNat, OpenNat, ConeNat, RestrictedNat, PortRestrictedNat, SymmetricNat, SymmetricFirewall, BlockedNat, PartialBlockedNat, NumNatTypes } |
Public Member Functions | |
PSTUNClient () | |
PSTUNClient (const PString &server, WORD portBase=0, WORD portMax=0, WORD portPairBase=0, WORD portPairMax=0) | |
PSTUNClient (const PIPSocket::Address &serverAddress, WORD serverPort=DefaultPort, WORD portBase=0, WORD portMax=0, WORD portPairBase=0, WORD portPairMax=0) | |
void | Initialise (const PString &server, WORD portBase=0, WORD portMax=0, WORD portPairBase=0, WORD portPairMax=0) |
virtual PString | GetName () const |
virtual bool | GetServerAddress (PIPSocket::Address &address, WORD &port) const |
PBoolean | SetServer (const PString &server) |
PBoolean | SetServer (const PIPSocket::Address &serverAddress, WORD serverPort=0) |
NatTypes | GetNatType (PBoolean force=PFalse) |
PString | GetNatTypeName (PBoolean force=PFalse) |
RTPSupportTypes | GetRTPSupport (PBoolean force=PFalse) |
virtual PBoolean | GetExternalAddress (PIPSocket::Address &externalAddress, const PTimeInterval &maxAge=1000) |
virtual bool | GetInterfaceAddress (PIPSocket::Address &internalAddress) const |
void | InvalidateExternalAddressCache () |
PBoolean | CreateSocket (PUDPSocket *&socket, const PIPSocket::Address &binding=PIPSocket::GetDefaultIpAny(), WORD localPort=0) |
virtual PBoolean | CreateSocketPair (PUDPSocket *&socket1, PUDPSocket *&socket2, const PIPSocket::Address &binding=PIPSocket::GetDefaultIpAny()) |
const PTimeInterval | GetTimeout () const |
void | SetTimeout (const PTimeInterval &timeout) |
PINDEX | GetRetries () const |
void | SetRetries (PINDEX retries) |
PINDEX | GetSocketsForPairing () const |
void | SetSocketsForPairing (PINDEX numSockets) |
virtual bool | IsAvailable (const PIPSocket::Address &binding=PIPSocket::GetDefaultIpAny()) |
Static Public Member Functions | |
static PStringList | GetNatMethodName () |
static PString | GetNatTypeString (NatTypes type) |
Protected Member Functions | |
bool | OpenSocket (PUDPSocket &socket, PortInfo &portInfo, const PIPSocket::Address &binding) const |
Protected Attributes | |
PIPSocket::Address | serverAddress |
WORD | serverPort |
PTimeInterval | replyTimeout |
PINDEX | pollRetries |
PINDEX | numSocketsForPairing |
NatTypes | natType |
PIPSocket::Address | cachedExternalAddress |
PIPSocket::Address | interfaceAddress |
PTime | timeAddressObtained |
PSTUNClient::PSTUNClient | ( | ) |
PSTUNClient::PSTUNClient | ( | const PString & | server, | |
WORD | portBase = 0 , |
|||
WORD | portMax = 0 , |
|||
WORD | portPairBase = 0 , |
|||
WORD | portPairMax = 0 | |||
) |
PSTUNClient::PSTUNClient | ( | const PIPSocket::Address & | serverAddress, | |
WORD | serverPort = DefaultPort , |
|||
WORD | portBase = 0 , |
|||
WORD | portMax = 0 , |
|||
WORD | portPairBase = 0 , |
|||
WORD | portPairMax = 0 | |||
) |
void PSTUNClient::Initialise | ( | const PString & | server, | |
WORD | portBase = 0 , |
|||
WORD | portMax = 0 , |
|||
WORD | portPairBase = 0 , |
|||
WORD | portPairMax = 0 | |||
) |
static PStringList PSTUNClient::GetNatMethodName | ( | ) | [inline, static] |
Get the NAT Method Name
virtual PString PSTUNClient::GetName | ( | ) | const [inline, virtual] |
Get the NAT traversal method name
Implements PNatMethod.
virtual bool PSTUNClient::GetServerAddress | ( | PIPSocket::Address & | address, | |
WORD & | port | |||
) | const [virtual] |
Get the current server address and port being used.
address | Address of server |
port | Port server is using. |
Implements PNatMethod.
Set the STUN server to use. The server string may be of the form host:port. If :port is absent then the default port 3478 is used. The substring port can also be a service name as found in /etc/services. The host substring may be a DNS name or explicit IP address.
PBoolean PSTUNClient::SetServer | ( | const PIPSocket::Address & | serverAddress, | |
WORD | serverPort = 0 | |||
) |
Set the STUN server to use by IP address and port. If serverPort is zero then the default port of 3478 is used.
Determine via the STUN protocol the NAT type for the router. This will cache the last determine NAT type. Use the force variable to guarantee an up to date value.
force | Force a new check |
Determine via the STUN protocol the NAT type for the router. As for GetNatType() but returns an English string for the type.
force | Force a new check |
Get NatTypes enumeration as an English string for the type.
type | NAT Type to get name of |
RTPSupportTypes PSTUNClient::GetRTPSupport | ( | PBoolean | force = PFalse |
) | [virtual] |
Return an indication if the current STUN type supports RTP Use the force variable to guarantee an up to date test
force | Force a new check |
Implements PNatMethod.
virtual PBoolean PSTUNClient::GetExternalAddress | ( | PIPSocket::Address & | externalAddress, | |
const PTimeInterval & | maxAge = 1000 | |||
) | [virtual] |
Determine the external router address. This will send UDP packets out using the STUN protocol to determine the intervening routers external IP address.
A cached address is returned provided it is no older than the time specified.
externalAddress | External address of router |
maxAge | Maximum age for caching |
Implements PNatMethod.
virtual bool PSTUNClient::GetInterfaceAddress | ( | PIPSocket::Address & | internalAddress | ) | const [virtual] |
Return the interface NAT router is using.
Implements PNatMethod.
void PSTUNClient::InvalidateExternalAddressCache | ( | ) |
Invalidates the cached external address This allows to lazily update the external address cache at the next attempt to get the external address.
PBoolean PSTUNClient::CreateSocket | ( | PUDPSocket *& | socket, | |
const PIPSocket::Address & | binding = PIPSocket::GetDefaultIpAny() , |
|||
WORD | localPort = 0 | |||
) | [virtual] |
Create a single socket. The STUN protocol is used to create a socket for which the external IP address and port numbers are known. A PUDPSocket descendant is returned which will, in response to GetLocalAddress() return the externally visible IP and port rather than the local machines IP and socket.
The will create a new socket pointer. It is up to the caller to make sure the socket is deleted to avoid memory leaks.
The socket pointer is set to NULL if the function fails and returns PFalse.
Implements PNatMethod.
virtual PBoolean PSTUNClient::CreateSocketPair | ( | PUDPSocket *& | socket1, | |
PUDPSocket *& | socket2, | |||
const PIPSocket::Address & | binding = PIPSocket::GetDefaultIpAny() | |||
) | [virtual] |
Create a socket pair. The STUN protocol is used to create a pair of sockets with adjacent port numbers for which the external IP address and port numbers are known. PUDPSocket descendants are returned which will, in response to GetLocalAddress() return the externally visible IP and port rather than the local machines IP and socket.
The will create new socket pointers. It is up to the caller to make sure the sockets are deleted to avoid memory leaks.
The socket pointers are set to NULL if the function fails and returns PFalse.
Implements PNatMethod.
const PTimeInterval PSTUNClient::GetTimeout | ( | ) | const [inline] |
Get the timeout for responses from STUN server.
void PSTUNClient::SetTimeout | ( | const PTimeInterval & | timeout | ) | [inline] |
Set the timeout for responses from STUN server.
timeout | New timeout in milliseconds |
PINDEX PSTUNClient::GetRetries | ( | ) | const [inline] |
Get the number of retries for responses from STUN server.
void PSTUNClient::SetRetries | ( | PINDEX | retries | ) | [inline] |
Set the number of retries for responses from STUN server.
retries | Number of retries |
PINDEX PSTUNClient::GetSocketsForPairing | ( | ) | const [inline] |
Get the number of sockets to create in attempt to get a port pair. RTP requires a pair of consecutive ports. To get this several sockets must be opened and fired through the NAT firewall to get a pair. The busier the firewall the more sockets will be required.
void PSTUNClient::SetSocketsForPairing | ( | PINDEX | numSockets | ) | [inline] |
Set the number of sockets to create in attempt to get a port pair. RTP requires a pair of consecutive ports. To get this several sockets must be opened and fired through the NAT firewall to get a pair. The busier the firewall the more sockets will be required.
numSockets | Number opf sockets to create |
virtual bool PSTUNClient::IsAvailable | ( | const PIPSocket::Address & | binding = PIPSocket::GetDefaultIpAny() |
) | [virtual] |
Returns whether the Nat Method is ready and available in assisting in NAT Traversal. The principal is this function is to allow the EP to detect various methods and if a method is detected then this method is available for NAT traversal. The availablity of the STUN Method is dependant on the Type of NAT being used.
binding | Interface to see if NAT is available on |
Implements PNatMethod.
bool PSTUNClient::OpenSocket | ( | PUDPSocket & | socket, | |
PortInfo & | portInfo, | |||
const PIPSocket::Address & | binding | |||
) | const [protected] |
PIPSocket::Address PSTUNClient::serverAddress [protected] |
WORD PSTUNClient::serverPort [protected] |
PTimeInterval PSTUNClient::replyTimeout [protected] |
PINDEX PSTUNClient::pollRetries [protected] |
PINDEX PSTUNClient::numSocketsForPairing [protected] |
NatTypes PSTUNClient::natType [protected] |
PIPSocket::Address PSTUNClient::cachedExternalAddress [protected] |
PIPSocket::Address PSTUNClient::interfaceAddress [protected] |
PTime PSTUNClient::timeAddressObtained [protected] |