A partir do sgcWebSockets 2022.6, um novo componente foi incluído na biblioteca: o cliente ICE, que implementa a RFC8445. ICE é um dos protocolos usados no WebRTC (junto com STUN, TURN, WebSockets... já suportados). O Interactive Connectivity Establishment (ICE) é uma técnica usada em redes de computadores para encontrar as formas mais diretas de dois computadores se comunicarem em redes peer-to-peer. É mais comumente usado em mídia interativa como VoIP, comunicações peer-to-peer, vídeo e mensagens instantâneas. Nessas aplicações, comunicar-se por meio de um servidor central seria lento e custoso, mas a comunicação direta entre clientes na Internet é muito difícil devido a tradutores de endereços de rede (NATs), firewalls e outras barreiras de rede.
Coleta de candidatos
O ICE inicia a coleta de candidatos, geralmente obtendo endereços IP locais, endereço reflexivo via protocolo STUN e endereço retransmitido via protocolo TURN.
Para iniciar a coleta, chame o método GatherCandidates: isso iniciará um timer interno que primeiro obtém os endereços IP locais, depois conecta ao servidor STUN para obter o endereço IP reflexivo e, por fim, conecta ao servidor TURN para obter o endereço IP retransmitido.
Cada vez que um novo candidato é obtido, o evento OnICECandidate é chamado de forma assíncrona. Se houver algum erro durante a coleta, o evento OnICECandidateError é disparado.
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;
Emparelhamento de candidatos
Depois que os candidatos forem obtidos (locais e remotos) e as descrições SDP forem definidas, o cliente ICE chamador pode iniciar o processamento de todos os pares de candidatos para encontrar aqueles que conseguem trocar dados. Para iniciar esse processo, chame o método ProcessCandidates.
O método ProcessCandidates avalia todos os pares de candidatos enviando um pacote STUN binding; se esse pacote for recebido como resposta pelo outro peer, significa que a conexão é possível entre esses 2 peers e o par é nomeado.
Quando o emparelhamento é bem-sucedido, o evento OnICECandidatePairNominated é disparado de forma assíncrona. Se o emparelhamento apresentar um erro ou não conseguir conectar após um timeout, o evento OnICECandidatePairFailed é disparado.
