2015-03-11 2 views
5

ich eine WebRTC App haben, und lassen Sie uns zwei Kunden sagen (client1 und client2), ist es eine Möglichkeit, um herauszufinden, welcher Kandidat ICE von client1 gegeben durch client2 und umgekehrt? weil, um jedes Mal, dies herauszufinden, ich wireshark auf beiden Clients verwenden haben, dachte ich, die sdp Lesen könnte helfen, aber ich war falsch, da es alle möglichen Kandidaten gibt ...WebRTC: Bestimmen Sie den ausgewählten ICE Kandidat

Szenario: alle UDP Ports von Client1 sind blockiert (blockiert mich zu Testzwecken).
Client1 SDP:

... 
a=rtcp:49407 IN IP4 <client1's IP> 
a=candidate:3864409487 1 udp 2122194687 <client1's IP> 49407 typ host generation 0 // this would never work, since the udp ports are blocked... 
a=candidate:3864409487 2 udp 2122194687 <client1's IP> 49407 typ host generation 0 
a=candidate:2832583039 1 tcp 1518214911 <client1's IP> 0 typ host tcptype active generation 0 
a=candidate:2832583039 2 tcp 1518214911 <client1's IP> 0 typ host tcptype active generation 0 
a=candidate:973648460 1 udp 25042687 <TURN server IP> 64790 typ relay raddr <Proxy IP> rport 39963 generation 0 
a=ice-ufrag:YSvrOiav8TglpCWD 
... 
+3

Schauen Sie sich dieses Themas: https://groups.google.com/d/msg/discuss-webrtc/-VReEXf9RBM/h91i7CD-oJ8 J –

Antwort

3

Nun, genommen von meiner answer auf eine andere Frage

Ich schrieb und getestet, um die unten Stück Code, arbeitet in neuesten Versionen von Firefox und Chrome, getConnectionDetails liefert ein Versprechen, die Verbindungsdetails löst:

function getConnectionDetails(peerConnection){ 


    var connectionDetails = {}; // the final result object. 

    if(window.chrome){ // checking if chrome 

    var reqFields = [ 'googLocalAddress', 
         'googLocalCandidateType', 
         'googRemoteAddress', 
         'googRemoteCandidateType' 
        ]; 
    return new Promise(function(resolve, reject){ 
     peerConnection.getStats(function(stats){ 
     var filtered = stats.result().filter(function(e){return e.id.indexOf('Conn-audio')==0 && e.stat('googActiveConnection')=='true'})[0]; 
     if(!filtered) return reject('Something is wrong...'); 
     reqFields.forEach(function(e){connectionDetails[e.replace('goog', '')] = filtered.stat(e)}); 
     resolve(connectionDetails); 
     }); 
    }); 

    }else{ // assuming it is firefox 
    return peerConnection.getStats(null).then(function(stats){ 
     var selectedCandidatePair = stats[Object.keys(stats).filter(function(key){return stats[key].selected})[0]] 
      , localICE = stats[selectedCandidatePair.localCandidateId] 
      , remoteICE = stats[selectedCandidatePair.remoteCandidateId]; 
     connectionDetails.LocalAddress = [localICE.ipAddress, localICE.portNumber].join(':'); 
     connectionDetails.RemoteAddress = [remoteICE.ipAddress, remoteICE.portNumber].join(':'); 
     connectionDetails.LocalCandidateType = localICE.candidateType; 
     connectionDetails.RemoteCandidateType = remoteICE.candidateType; 
     return connectionDetails; 
    }); 

    } 
} 


//usage example: 
getConnectionDetails(pc).then(console.log.bind(console)); 
+0

Ich habe '' '' 'prflx''' für' '' googRemoteCandidateType''' und '' 'relay''' für' '' googLocalCandidateType'''. Weißt du was "prflx" bedeutet? –

+0

@anand müssen überprüfen, aber ich denke, es ist der Betäubungseiskandidat – mido