sgcWebSockets 4.5.2 sürümünden itibaren, sgcWebSockets kütüphanesini kullanarak kendi STUN/TURN Sunucunuzu ve İstemcilerinizi oluşturabilirsiniz.
STUN
Session Traversal Utilities for NAT (STUN) (kısaltma içinde kısaltma), genel adresinizi keşfetmek ve bir eşle (peer) doğrudan bağlantıyı engelleyecek olan yönlendiricinizdeki herhangi bir kısıtlamayı belirlemek için bir protokoldür.
İstemci, İnternet'teki bir STUN sunucusuna bir istek gönderir; sunucu da istemcinin genel adresiyle ve istemcinin yönlendiricinin NAT'ı arkasından erişilebilir olup olmadığıyla yanıt verir.
TURN
NAT kullanan bazı yönlendiriciler, 'Simetrik NAT' adı verilen bir kısıtlama uygular. Bu, yönlendiricinin yalnızca daha önce bağlandığınız eşlerden gelen bağlantıları kabul edeceği anlamına gelir.
Traversal Using Relays around NAT (TURN), bir TURN sunucusuyla bir bağlantı açıp tüm bilgileri o sunucu üzerinden ileterek Simetrik NAT kısıtlamasını aşmayı amaçlar. Bir TURN sunucusuyla bir bağlantı oluşturur ve tüm eşlere paketleri sunucuya göndermelerini söylersiniz; bunlar daha sonra size iletilir. Bu açıkça bir miktar ek yük getirir, bu nedenle yalnızca başka alternatif yoksa kullanılır.
Bir STUN/TURN Sunucusu Oluşturma
STUN/TURN Delphi Sunucusu oluşturma süreci çok basittir, yalnızca bir TsgcTURNServer oluşturun ve aşağıdaki özellikleri yapılandırın:
- Port: varsayılan olarak 3478'dir, STUN/TURN protokolü için yaygın bağlantı noktası.
- STUNOptions: burada STUN Seçeneklerini yapılandırabilirsiniz, genellikle STUN istekleri kimlik doğrulama kullanmaz, bu nedenle bunu varsayılan değerlerle bırakabilirsiniz.
- TURNOptions. burada TURN Seçeneklerini yapılandırabilirsiniz, genellikle TURN sunucuları Uzun Süreli kimlik bilgileri gerektirir (çünkü TURN, NAT'lar arkasındaki eşler arasında veri alışverişi için Relay Adresi kullanır ve bu yüksek kaynak gerektirir). Burada Relay Adresinin IP Adresini yapılandırabilirsiniz, TURNOptions.Allocation.RelayIP içinde yapılandırın.
Bir TURN istemcisi bir İstek gönderdiğinde parolayı ayarlamak için OnSTUNRequestAuthorization olayını işleyin.
Son olarak, sunucuyu başlatmak için Active özelliğini True olarak ayarlayın.
STUN isteklerinin yetkilendirme gerektirmediği ve TURN isteklerinin Uzun Süreli kimlik bilgileri gerektirdiği örnek bir yapılandırmayı aşağıda bulabilirsiniz.
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;
Bir STUN/TURN İstemcisi Oluşturma
Yeni bir Delphi STUN/TURN İstemcisi oluşturmak, bir Sunucu kadar basittir. Yalnızca bir TsgcTURNClient oluşturun ve aşağıdaki özellikleri yapılandırın:
- Host: STUN/TURN sunucusunun çalıştığı dns adı veya IP Adresidir.
- Port: bağlantı noktasıdır, varsayılan olarak 3478.
- STUNOptions: burada STUN Seçeneklerini yapılandırabilirsiniz, genellikle STUN istekleri kimlik doğrulama kullanmaz, bu nedenle bunu varsayılan değerlerle bırakabilirsiniz.
- TURNOptions. burada TURN Seçeneklerini yapılandırabilirsiniz, genellikle TURN sunucuları Uzun Süreli kimlik bilgileri gerektirir (çünkü TURN, NAT'lar arkasındaki eşler arasında veri alışverişi için Relay Adresi kullanır ve bu yüksek kaynak gerektirir).
IP Adresi Ayırma (Allocate)
TURN Protokolü, NAT'lar arkasındaki eşler arasında veri alışverişi için bir Relay IP Adresi kullanmaya olanak tanır.
Bir TURN sunucusunda yeni bir Relay IP Adresi oluşturmak için, istemci önce Allocate metodunu çağırmalıdır; bu metot, yeni bir Relay IP Adresi oluşturmak için TURN sunucusuna bir İstek gönderir; TURN sunucusu yeni bir Relay IP Adresi oluşturabilirse, istemci başarılı bir yanıt alır. İstemci, Allocation'ın ömrü içinde tanımlanan süre boyunca diğer eşlerle iletişim kurabilecektir.
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;
Süre dolmasını önlemek için ömür, Refresh metodu kullanılarak güncellenebilir. Ömür (Lifetime), sürenin dolacağı saniye sayısıdır. Değer sıfırsa Allocation silinir.
oTURN.Refresh(600);
