Server e client STUN per Delphi

· Componenti

STUN (Session Traversal Utilities for NAT) è un protocollo IETF usato per audio e video in tempo reale nelle reti IP. STUN è un protocollo server-client, un server STUN di solito opera sia su UDP che su TCP e ascolta sulla porta 3478.

Lo scopo principale del protocollo STUN è permettere a un dispositivo dietro un NAT di scoprire il proprio IP pubblico e che tipo di NAT è.

STUN fornisce un meccanismo per comunicare tra peer dietro un NAT. I peer inviano una richiesta a un server STUN per sapere quale sia l'indirizzo IP pubblico e la porta. Le richieste di binding inviate dal client al server sono usate per determinare i binding di IP e porte allocati dai NAT. Il client STUN invia una richiesta Binding al server STUN, il server esamina l'IP e la porta sorgente usati dal client, e restituisce queste informazioni al client.

Server STUN

TsgcSTUNServer è il server che implementa il protocollo STUN e permette di elaborare le richieste di binding dai client STUN.

Il server STUN può essere configurato con o senza autenticazione, può verificare l'attributo Fingerprint, inviare un server alternativo e altro ancora.

Utilizzo di base

Di solito i server STUN girano sulla porta UDP 3478 e non richiedono autenticazione, quindi per configurare un server STUN, imposta la porta di ascolto (per default 3478) e avvia il server.

Configura il server

Imposta la proprietà Active = True per avviare il server STUN.

Guarda il codice Delphi seguente che mostra come avviare un nuovo server STUN per Delphi.

oSTUN := TsgcSTUNServer.Create(nil);
oSTUN.Port := 3478;
oSTUN.Active := True; 

Long-Term Credentials 

Di solito i server STUN sono configurati senza autenticazione, quindi qualsiasi client STUN può inviare una richiesta di binding e aspettarsi una risposta dal server senza autenticazione.

Il server STUN di sgcWebSockets supporta Long-Term Credentials, quindi puoi configurare TsgcSTUNServer per accettare solo richieste di binding con informazioni Long-Term credentials.

Per configurarlo, accedi alla proprietà STUNOptions.Authorization e abilitala.

Poi accedi alla proprietà LongTermCredentials e abilitala. Di default, questo tipo di autorizzazione è già configurato con una stringa Realm e con un valore StaleNonce di default di 10 minuti (= 600 secondi).

Guarda il codice Delphi seguente che mostra come creare un nuovo server STUN per Delphi con Long-Credentials abilitate.

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

Client STUN 

 TsgcSTUNClient è il client che implementa il protocollo STUN e permette di inviare richieste di binding ai server STUN.

Il componente permette di usare UDP e TCP come trasporto, e quando si usa UDP come trasporto implementa un meccanismo di ritrasmissione per re-inviare le richieste se la risposta non arriva dopo un breve tempo.

Utilizzo di base

Di solito i server STUN girano sulla porta UDP 3478 e non richiedono autenticazione, quindi per inviare una richiesta di binding STUN, compila le proprietà del server per permettere al client di sapere dove connettersi e gestisci gli eventi in cui il componente riceverà la risposta dal server.

Configura il server

Chiama il metodo SendRequest per inviare una richiesta di binding al server STUN.

Gestisci gli eventi

Guarda il codice Delphi seguente che mostra come creare un nuovo client STUN per Delphi e connettersi a un server STUN.




oSTUN := TsgcSTUNClient.Create(nil);
oSTUN.Host := 'stun.sgcwebsockets.com';
oSTUN.Port := 3478;
oSTUN.SendRequest;
procedure OnSTUNResponseSuccess(Sender: TObject; const aMessage: TsgcSTUN_Message; const aBinding: TsgcSTUN_ResponseBinding);
begin
  DoLog('Remote IP: ' + aBinding.RemoteIP + '. Remote Port: ' + IntToStr(aBinding.RemotePort));
end;
procedure OnSTUNResponseError(Sender: TObject; const aMessage: TsgcSTUN_Message; const aError: TsgcSTUN_ResponseError);
begin
  DoLog('Error: ' + IntToStr(aError.Code) + ' ' + aError.Reason);
end; 
});