Serveur et client STUN/TURN Delphi (4/4)

· Composants

Depuis sgcWebSockets 4.5.2, tu peux construire tes propres serveur et clients STUN/TURN avec la bibliothèque sgcWebSockets.

STUN

Session Traversal Utilities for NAT (STUN) (acronyme dans un acronyme) est un protocole pour découvrir ton adresse publique et déterminer les restrictions de ton routeur qui empêcheraient une connexion directe avec un pair.

Le client enverra une requête à un serveur STUN sur Internet qui répondra avec l'adresse publique du client et indiquera si le client est accessible derrière le NAT du routeur ou non.

TURN

Certains routeurs utilisant NAT appliquent une restriction appelée « Symmetric NAT ». Cela signifie que le routeur n'acceptera que les connexions des pairs avec lesquels tu t'es déjà connecté.

Traversal Using Relays around NAT (TURN) vise à contourner la restriction Symmetric NAT en ouvrant une connexion avec un serveur TURN et en relayant toutes les informations via ce serveur. Tu créerais une connexion avec un serveur TURN et dirais à tous les pairs d'envoyer des paquets au serveur qui te seront ensuite transférés. Cela entraîne évidemment une certaine surcharge, donc c'est utilisé uniquement s'il n'y a pas d'autres alternatives.


Construire un serveur STUN/TURN 

Le processus pour créer un serveur STUN/TURN Delphi est très simple, il te suffit de créer un TsgcTURNServer et de configurer les propriétés suivantes :

Gère l'événement OnSTUNRequestAuthorization pour définir le mot de passe quand un client TURN envoie une requête.

Enfin, définis la propriété Active à True pour démarrer le serveur.

Voici un exemple de configuration où les requêtes STUN ne nécessitent pas d'autorisation et les requêtes TURN nécessitent des identifiants long terme.

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; 

Construire un client STUN/TURN 

Créer un nouveau client STUN/TURN Delphi est aussi simple qu'un serveur. Il te suffit de créer un TsgcTURNClient et de configurer les propriétés suivantes :


Allouer une adresse IP

Le protocole TURN permet d'utiliser une adresse IP relayée pour échanger des données entre pairs derrière des NAT.

Pour créer une nouvelle adresse IP relayée sur un serveur TURN, le client doit d'abord appeler la méthode Allocate, cette méthode envoie une requête au serveur TURN pour créer une nouvelle adresse IP relayée. Si le serveur TURN peut créer une nouvelle adresse IP relayée, le client recevra une réponse réussie. Le client pourra communiquer avec d'autres pairs pendant la durée définie dans le lifetime de l'allocation.

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; 

Le lifetime peut être mis à jour pour éviter l'expiration via la méthode Refresh. Le lifetime est le nombre de secondes avant expiration. Si la valeur est zéro, l'allocation sera supprimée.

oTURN.Refresh(600); 

Serveur TURN 

});

Démo compilée serveur / client TURN