Server
#include <icy/turn/server/server.h>
class ServerDefined in src/turn/include/icy/turn/server/server.h:126
TURN server RFC 5766 / RFC 6062 implementation. Listens on UDP and/or TCP, authenticates requests via ServerObserver, and manages ServerAllocation objects for each 5-tuple.
Public Methods
| Return | Name | Description |
|---|---|---|
Server | ||
~Server virtual | ||
void | start virtual | Binds and listens on the configured address, then starts the maintenance timer. |
void | stop virtual | Stops the timer, destroys all allocations, and closes server sockets. |
void | handleRequest | Routes an authenticated request to the appropriate handler based on state. Pending (Authenticating) requests are held until the observer calls back. |
void | handleAuthorizedRequest | Dispatches an already-authorized request to the specific method handler. |
void | handleBindingRequest | Handles a Binding request; responds with XOR-MAPPED-ADDRESS. |
void | handleAllocateRequest | Handles an Allocate request; creates a UDP or TCP ServerAllocation and sends a success response with XOR-RELAYED-ADDRESS and LIFETIME. |
void | handleConnectionBindRequest | Handles a ConnectionBind request by locating the TCPAllocation that owns the given CONNECTION-ID and delegating to it. |
void | respond | Sends a STUN response, signing it with MessageIntegrity if the request had a hash. Routes via UDP or TCP depending on request.transport. |
void | respondError | Constructs and sends an error response with SOFTWARE, REALM, NONCE, and ERROR-CODE. |
std::map< FiveTuple, ServerAllocation * > | allocations const | Returns a snapshot copy of the allocation map for safe iteration. Returned raw pointers are valid only while the server holds the allocations. |
void | addAllocation | Transfers ownership of alloc to the server and notifies the observer. |
void | removeAllocation | Removes alloc from the map and notifies the observer. Called automatically from the ServerAllocation destructor. |
ServerAllocation * | getAllocation | Looks up an allocation by its 5-tuple. |
TCPAllocation * | getTCPAllocation | Finds the TCPAllocation that owns a TCPConnectionPair with the given connection ID. |
net::TCPSocket::Ptr | getTCPSocket | Returns the accepted TCP socket whose peer address matches remoteAddr. |
void | releaseTCPSocket | Removes a TCP control socket from the server's socket list and unregisters callbacks. Called when the socket is handed off to a TCPAllocation (ConnectionBind). |
ServerObserver & | observer | |
const ServerOptions & | options const | |
net::UDPSocket & | udpSocket | |
net::TCPSocket & | tcpSocket | |
Timer & | timer | |
void | onTCPAcceptConnection | Accept callback for the TCP listening socket; registers new connections for STUN message processing. |
bool | onTCPSocketClosed | Close callback for accepted TCP sockets; removes the socket from the list. |
bool | onSocketRecv | Receive callback for both UDP and TCP sockets; parses STUN messages and calls handleRequest() for each one. |
void | onTimer | Periodic maintenance callback; expires and removes stale allocations. |
void | scheduleDeferredTCPSocketRelease | Defers accepted TCP socket removal until after the active callback stack unwinds. |
void | drainReleasedTCPSockets |
Server
Server(ServerObserver & observer, const ServerOptions & options = ServerOptions())Defined in src/turn/include/icy/turn/server/server.h:131
Parameters
| Parameter | Type | Description |
|---|---|---|
observer | ServerObserver & | Observer used for authentication and allocation lifecycle events. |
options | const ServerOptions & | Server configuration; defaults to 0.0.0.0:3478 with TCP and UDP enabled. |
~Server
virtual
virtual ~Server()Defined in src/turn/include/icy/turn/server/server.h:132
start
virtual
virtual void start()Defined in src/turn/include/icy/turn/server/server.h:135
Binds and listens on the configured address, then starts the maintenance timer.
stop
virtual
virtual void stop()Defined in src/turn/include/icy/turn/server/server.h:138
Stops the timer, destroys all allocations, and closes server sockets.
handleRequest
void handleRequest(Request & request, AuthenticationState state)Defined in src/turn/include/icy/turn/server/server.h:144
Routes an authenticated request to the appropriate handler based on state. Pending (Authenticating) requests are held until the observer calls back.
Parameters
| Parameter | Type | Description |
|---|---|---|
request | Request & | Incoming STUN request. |
state | AuthenticationState | Result of the observer's authenticateRequest() call. |
handleAuthorizedRequest
void handleAuthorizedRequest(Request & request)Defined in src/turn/include/icy/turn/server/server.h:148
Dispatches an already-authorized request to the specific method handler.
Parameters
| Parameter | Type | Description |
|---|---|---|
request | Request & | Authorized STUN request. |
handleBindingRequest
void handleBindingRequest(Request & request)Defined in src/turn/include/icy/turn/server/server.h:152
Handles a Binding request; responds with XOR-MAPPED-ADDRESS.
Parameters
| Parameter | Type | Description |
|---|---|---|
request | Request & | Incoming Binding request. |
handleAllocateRequest
void handleAllocateRequest(Request & request)Defined in src/turn/include/icy/turn/server/server.h:157
Handles an Allocate request; creates a UDP or TCP ServerAllocation and sends a success response with XOR-RELAYED-ADDRESS and LIFETIME.
Parameters
| Parameter | Type | Description |
|---|---|---|
request | Request & | Incoming Allocate request. |
handleConnectionBindRequest
void handleConnectionBindRequest(Request & request)Defined in src/turn/include/icy/turn/server/server.h:162
Handles a ConnectionBind request by locating the TCPAllocation that owns the given CONNECTION-ID and delegating to it.
Parameters
| Parameter | Type | Description |
|---|---|---|
request | Request & | Incoming ConnectionBind request. |
respond
void respond(Request & request, stun::Message & response)Defined in src/turn/include/icy/turn/server/server.h:168
Sends a STUN response, signing it with MessageIntegrity if the request had a hash. Routes via UDP or TCP depending on request.transport.
Parameters
| Parameter | Type | Description |
|---|---|---|
request | Request & | The original request (provides transport and remote address). |
response | stun::Message & | The response message to send. |
respondError
void respondError(Request & request, int errorCode, const char * errorDesc)Defined in src/turn/include/icy/turn/server/server.h:174
Constructs and sends an error response with SOFTWARE, REALM, NONCE, and ERROR-CODE.
Parameters
| Parameter | Type | Description |
|---|---|---|
request | Request & | The original request. |
errorCode | int | STUN error code (e.g. 400, 401, 437). |
errorDesc | const char * | Human-readable error description string. |
allocations
const
std::map< FiveTuple, ServerAllocation * > allocations() constDefined in src/turn/include/icy/turn/server/server.h:179
Returns a snapshot copy of the allocation map for safe iteration. Returned raw pointers are valid only while the server holds the allocations.
Returns
Map from FiveTuple to raw ServerAllocation pointers.
addAllocation
void addAllocation(std::unique_ptr< ServerAllocation > alloc)Defined in src/turn/include/icy/turn/server/server.h:183
Transfers ownership of alloc to the server and notifies the observer.
Parameters
| Parameter | Type | Description |
|---|---|---|
alloc | std::unique_ptr< ServerAllocation > | Newly constructed allocation to register. |
removeAllocation
void removeAllocation(ServerAllocation * alloc)Defined in src/turn/include/icy/turn/server/server.h:188
Removes alloc from the map and notifies the observer. Called automatically from the ServerAllocation destructor.
Parameters
| Parameter | Type | Description |
|---|---|---|
alloc | ServerAllocation * | Allocation being destroyed. |
getAllocation
ServerAllocation * getAllocation(const FiveTuple & tuple)Defined in src/turn/include/icy/turn/server/server.h:193
Looks up an allocation by its 5-tuple.
Returns
Pointer to the matching allocation, or nullptr if not found.
Parameters
| Parameter | Type | Description |
|---|---|---|
tuple | const FiveTuple & | The 5-tuple to search for. |
getTCPAllocation
TCPAllocation * getTCPAllocation(const uint32_t & connectionID)Defined in src/turn/include/icy/turn/server/server.h:198
Finds the TCPAllocation that owns a TCPConnectionPair with the given connection ID.
Returns
Pointer to the owning TCPAllocation, or nullptr if not found.
Parameters
| Parameter | Type | Description |
|---|---|---|
connectionID | const uint32_t & | TURN CONNECTION-ID to search for. |
getTCPSocket
net::TCPSocket::Ptr getTCPSocket(const net::Address & remoteAddr)Defined in src/turn/include/icy/turn/server/server.h:203
Returns the accepted TCP socket whose peer address matches remoteAddr.
Returns
Shared pointer to the socket, or empty if not found.
Parameters
| Parameter | Type | Description |
|---|---|---|
remoteAddr | const net::Address & | Peer address to search for. |
releaseTCPSocket
void releaseTCPSocket(const net::Socket & socket)Defined in src/turn/include/icy/turn/server/server.h:208
Removes a TCP control socket from the server's socket list and unregisters callbacks. Called when the socket is handed off to a TCPAllocation (ConnectionBind).
Parameters
| Parameter | Type | Description |
|---|---|---|
socket | const net::Socket & | The socket to release. |
observer
ServerObserver & observer()Defined in src/turn/include/icy/turn/server/server.h:211
Returns
Reference to the observer provided at construction.
options
const
const ServerOptions & options() constDefined in src/turn/include/icy/turn/server/server.h:214
Returns
Reference to the immutable options struct.
udpSocket
net::UDPSocket & udpSocket()Defined in src/turn/include/icy/turn/server/server.h:217
Returns
Reference to the UDP server socket.
tcpSocket
net::TCPSocket & tcpSocket()Defined in src/turn/include/icy/turn/server/server.h:220
Returns
Reference to the TCP server listening socket.
timer
Timer & timer()Defined in src/turn/include/icy/turn/server/server.h:223
Returns
Reference to the maintenance timer.
onTCPAcceptConnection
void onTCPAcceptConnection(const net::TCPSocket::Ptr & sock)Defined in src/turn/include/icy/turn/server/server.h:228
Accept callback for the TCP listening socket; registers new connections for STUN message processing.
Parameters
| Parameter | Type | Description |
|---|---|---|
sock | const net::TCPSocket::Ptr & | Newly accepted TCP socket. |
onTCPSocketClosed
bool onTCPSocketClosed(net::Socket & socket)Defined in src/turn/include/icy/turn/server/server.h:232
Close callback for accepted TCP sockets; removes the socket from the list.
Parameters
| Parameter | Type | Description |
|---|---|---|
socket | net::Socket & | The closed socket. |
onSocketRecv
bool onSocketRecv(net::Socket & socket, const MutableBuffer & buffer, const net::Address & peerAddress)Defined in src/turn/include/icy/turn/server/server.h:239
Receive callback for both UDP and TCP sockets; parses STUN messages and calls handleRequest() for each one.
Parameters
| Parameter | Type | Description |
|---|---|---|
socket | net::Socket & | The receiving socket. |
buffer | const MutableBuffer & | Received data buffer. |
peerAddress | const net::Address & | Source address of the data. |
onTimer
void onTimer()Defined in src/turn/include/icy/turn/server/server.h:243
Periodic maintenance callback; expires and removes stale allocations.
scheduleDeferredTCPSocketRelease
void scheduleDeferredTCPSocketRelease()Defined in src/turn/include/icy/turn/server/server.h:246
Defers accepted TCP socket removal until after the active callback stack unwinds.
drainReleasedTCPSockets
void drainReleasedTCPSockets()Defined in src/turn/include/icy/turn/server/server.h:247
Private Attributes
| Return | Name | Description |
|---|---|---|
std::mutex | _mutex | |
ServerObserver & | _observer | |
ServerOptions | _options | |
net::SocketEmitter | _udpSocket | |
net::SocketEmitter | _tcpSocket | |
std::vector< net::SocketEmitter > | _tcpSockets | |
std::unordered_set< const net::Socket * > | _pendingReleasedTCPSockets | |
bool | _tcpSocketReleaseScheduled | |
ServerAllocationMap | _allocations | |
Timer | _timer |
_mutex
std::mutex _mutexDefined in src/turn/include/icy/turn/server/server.h:250
_observer
ServerObserver & _observerType: ServerObserver &
Defined in src/turn/include/icy/turn/server/server.h:251
_options
ServerOptions _optionsType: ServerOptions
Defined in src/turn/include/icy/turn/server/server.h:252
_udpSocket
net::SocketEmitter _udpSocketType: net::SocketEmitter
Defined in src/turn/include/icy/turn/server/server.h:253
_tcpSocket
net::SocketEmitter _tcpSocketType: net::SocketEmitter
Defined in src/turn/include/icy/turn/server/server.h:254
_tcpSockets
std::vector< net::SocketEmitter > _tcpSocketsType: std::vector< net::SocketEmitter >
Defined in src/turn/include/icy/turn/server/server.h:255
_pendingReleasedTCPSockets
std::unordered_set< const net::Socket * > _pendingReleasedTCPSocketsType: std::unordered_set< const net::Socket * >
Defined in src/turn/include/icy/turn/server/server.h:256
_tcpSocketReleaseScheduled
bool _tcpSocketReleaseScheduled {false}Defined in src/turn/include/icy/turn/server/server.h:257
_allocations
ServerAllocationMap _allocationsType: ServerAllocationMap
Defined in src/turn/include/icy/turn/server/server.h:258
_timer
Timer _timerType: Timer
