Server e client STUN/TURN per Delphi (4/4)

· Componenti

Da sgcWebSockets 4.5.2 puoi costruire i tuoi server e client STUN/TURN usando la libreria sgcWebSockets.

STUN

Session Traversal Utilities for NAT (STUN) (acronimo dentro un acronimo) è un protocollo per scoprire il tuo indirizzo pubblico e determinare eventuali restrizioni nel tuo router che impedirebbero una connessione diretta con un peer.

Il client invierà una richiesta a un server STUN su Internet che risponderà con l'indirizzo pubblico del client e se il client è accessibile o meno dietro il NAT del router.

TURN

Alcuni router che usano NAT impiegano una restrizione chiamata 'Symmetric NAT'. Questo significa che il router accetterà connessioni solo da peer a cui ti sei già connesso in precedenza.

Traversal Using Relays around NAT (TURN) serve a bypassare la restrizione del Symmetric NAT aprendo una connessione con un server TURN e instradando tutte le informazioni attraverso quel server. Crei una connessione con un server TURN e dici a tutti i peer di inviare i pacchetti al server che poi te li inoltrerà. Questo comporta ovviamente un certo overhead, quindi viene usato solo se non ci sono altre alternative.


Costruisci un server STUN/TURN 

Il processo per creare un server STUN/TURN per Delphi è molto semplice, basta creare un TsgcTURNServer e configurare le seguenti proprietà:

Gestisci l'evento OnSTUNRequestAuthorization per impostare la password quando un client TURN invia una richiesta.

Infine imposta la proprietà Active a True per avviare il server.

Trovi qui sotto un esempio di configurazione in cui le richieste STUN non richiedono autorizzazione e le richieste TURN richiedono Long-Term credentials.

oTURN := TsgcTURNServer.Create(nil);
oTURN.Port := 3478;
oTURN.STUNOptions.Authentication.Enabled := False;
oTURN.TURNOptions.Authentication.Enabled := True;
oTURN.TURNOptions.Authentication.LongTermCredentials.Enabled := True;
oTURN.TURNOptions.Authentication.LongTermCredentials.Realm := 'sgcWebSockets';
oTURN.TURNOptions.Authentication.LongTermCredentials.StaleNonce := 600;
oTURN.Active := True;
procedure OnSTUNRequestAuthorization(Sender: TObject; const aRequest: TsgcSTUN_Message; const aUsername, aRealm: string; var Password: string);
begin
  if (aUsername = 'my-user') and (aRealm = 'sgcWebSockets') then
    Password := 'my-password';
end; 

Costruisci un client STUN/TURN 

Creare un nuovo client STUN/TURN per Delphi è semplice come per un server. Basta creare un TsgcTURNClient e configurare le seguenti proprietà:


Allocazione dell'indirizzo IP

Il protocollo TURN permette di usare un indirizzo IP Relayed per scambiare dati tra peer che sono dietro NAT.

Per creare un nuovo indirizzo IP Relayed su un server TURN, il client deve prima chiamare il metodo Allocate: questo metodo invia una richiesta al server TURN per creare un nuovo indirizzo IP Relayed; se il server TURN può creare un nuovo indirizzo IP Relayed, il client riceverà una risposta valida. Il client potrà comunicare con altri peer durante il tempo definito nel lifetime dell'allocazione.

oTURN := TsgcTURNClient.Create(nil);
oTURN.Host := 'turn.sgcwebsockets.com';
oTURN.Port := 3478;
oTURN.Allocate();
procedure OnTURNAllocate(Sender: TObject; const aSocket: TsgcSocketConnection; const
aMessage: TsgcSTUN_Message; const aAllocation: TsgcTURN_ResponseAllocation);
begin
  DoLog('Relayed IP: ' + aAllocation.RelayedIP + '. Relayed Port: ' + IntToStr(aAllocation.RelayedPort));
end;
procedure OnSTUNResponseError(Sender: TObject; const aMessage: TsgcSTUN_Message;
const aError: TsgcSTUN_ResponseError);
begin
  DoLog('Error: ' + IntToStr(aError.Code) + ' ' + aError.Reason);
end; 

Il lifetime può essere aggiornato per evitare la scadenza usando il metodo Refresh. Il Lifetime è il numero di secondi prima della scadenza. Se il valore è zero l'allocazione verrà eliminata.

oTURN.Refresh(600);

Server TURN 

});

Demo compilata server / client TURN