Vanaf sgcWebSockets 2022.6 is er een nieuwe component in de bibliotheek opgenomen: de ICE-client die RFC 8445 implementeert. ICE is een van de protocollen die in WebRTC worden gebruikt (samen met STUN, TURN, WebSockets... die al worden ondersteund). Interactive Connectivity Establishment (ICE) is een techniek die in computernetwerken wordt gebruikt om manieren te vinden waarop twee computers in peer-to-peer-netwerken zo direct mogelijk met elkaar kunnen communiceren. Dit wordt het meest gebruikt voor interactieve media, zoals Voice over Internet Protocol (VoIP), peer-to-peer-communicatie, video en instant messaging. Bij dergelijke toepassingen zou communiceren via een centrale server traag en duur zijn, maar directe communicatie tussen clienttoepassingen op het internet is erg lastig door network address translators (NAT's), firewalls en andere netwerkbarrières.
Kandidaten verzamelen
ICE begint met het verzamelen van kandidaten; meestal worden lokale IP-adressen verkregen, een reflexief adres via het STUN-protocol en een relay-adres via het TURN-protocol.
Om het verzamelen te starten roep je de methode GatherCandidates aan; deze start een interne timer waarbij eerst de lokale IP-adressen worden opgehaald, vervolgens verbinding wordt gemaakt met de STUN-server om het reflexieve IP-adres te verkrijgen en ten slotte verbinding wordt gemaakt met de TURN-server om het relay-IP-adres op te halen.
Telkens wanneer een nieuwe kandidaat wordt verkregen, wordt het event OnICECandidate asynchroon aangeroepen; treedt er een fout op tijdens het verzamelen, dan wordt het event OnICECandidateError geactiveerd.
oICE := TsgcICEClient.Create(nil);
oTURN := TsgcTURNClient.Create(nil);
oTURN.Host := 'www.esegece.com';
oTURN.Port := 3478;
oTURN.TURNOptions.Authentication.Credentials := stauLongTermCredential;
oTURN.TURNOptions.Authentication.Username := 'sgc';
oTURN.TURNOptions.Authentication.Password := 'secret';
oICE.GatherCandidates();
procedure OnICECandidate(Sender: TObject; const aCandidate: TsgcICE_Candidate);
begin
DoLog('[#Candidate] ' + aCandidate.AsString);
end;
Kandidaten koppelen
Zodra de kandidaten zijn verkregen (lokaal en op afstand) en de SDP-beschrijvingen zijn ingesteld, kan de ICE-bellerclient beginnen met het verwerken van alle paren kandidaten om er te vinden die data kunnen uitwisselen. Om dit proces te starten roep je de methode ProcessCandidates aan.
De methode ProcessCandidates evalueert alle kandidaatparen door een STUN-bindingpakket te versturen; als het STUN-bindingpakket als antwoord van de andere peer wordt ontvangen, betekent dit dat verbinding tussen die 2 peers mogelijk is, dus wordt het paar genomineerd.
Wanneer de koppeling succesvol is, wordt het event OnICECandidatePairNominated asynchroon geactiveerd. Treedt er een fout op of kan er na een time-out geen verbinding worden gemaakt, dan wordt het event OnICECandidatePairFailed geactiveerd.
