Programmazione

Puo' capitare che si abbia la necessita' di testare un servizio STUN TURN senza voler usare i servizi che gia' ci sono a disposizione in rete tipo: Trickle ICE oppure Ice Test

Analizzando i risultati, le regole di base sono:

Il server STUN funziona se nei risultati otteniamo un candidato valido del tipo "srflx"
Il server TURN funziona se nei risultati otteniamo un candidato valido del tipo "relay"

In rete si trova questa risorsa di Carlos Delgado su Ourcodeworld.com

In pratica basta creare una pagina html contenente una roba del genere:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Test STUN/TURN</title>
    <link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
    <div id="log">
        <pre id="output"></pre>
        <script src="test.js"></script>
    </div>
</body>
</html>

e creare il file test.js che contiene una roba tipo:

const iceServers = [
    // Test some STUN server
    {
        urls: 'stun:<INDIRIZZO SERVER>:<PORTA>?transport=udp'
    },
    // Test some TURN server
    {
        urls: 'turn:<INDIRIZZO SERVER>:<PORTA>?transport=udp',
        username: 'NOMEUTENTE',
        credential: 'PASSWORD'
    }
];

const pc = new RTCPeerConnection({
    iceServers
});

pc.onicecandidate = (e) => {
    if (!e.candidate) return;

    // Display candidate string e.g
    // candidate:842163049 1 udp 1677729535 XXX.XXX.XX.XXXX 58481 typ srflx raddr 0.0.0.0 rport 0 generation 0 ufrag sXP5 network-cost 999
    console.log(e.candidate.candidate);
    document.getElementById("output").insertAdjacentHTML('afterbegin',e.candidate.candidate+ '<br><br>');
    console.log(e);

    // If a srflx candidate was found, notify that the STUN server works!
    if(e.candidate.candidate.indexOf("srflx") !== -1){
        console.log("The STUN server is reachable!");
        console.log(`   Your Public IP Address is: ${e.candidate.address}`);
        document.getElementById("output").insertAdjacentHTML('afterbegin','GOT SRFLX,  The STUN server is reachable!<br>');
    }
    // If a relay candidate was found, notify that the TURN server works!
        if(e.candidate.candidate.indexOf("relay") !== -1){
        console.log("The TURN server is reachable !");
        document.getElementById("output").insertAdjacentHTML('afterbegin','GOT RELAY, The TURN server is reachable !<br>');
    }
};
// Log errors:
// Remember that in most of the cases, even if its working, you will find a STUN host lookup received error
// Chrome tried to look up the IPv6 DNS record for server and got an error in that process. However, it may still be accessible through the IPv4 address
pc.onicecandidateerror = (e) => {
    console.error(e);
};
pc.createDataChannel('ourcodeworld-rocks');
pc.createOffer().then(offer => pc.setLocalDescription(offer));

Ora, lo script e' un po' modificato perche' il metodo proposto dall'autore a me non funzionava. Inoltre ho reindirizzato parte dell'output del file JS nella pagina HTML tanto per non aprire la console. Va da se che se si vogliono info piu' dettagliate c'e' da aprire nel browser la pagina per i developers (il modo per aprirla cambia a seconda del browser usato) e aprire la console.

No comments

The author does not allow comments to this entry