WebRTC:强制对等方使用TURN服务器

时间:2014-12-01 08:00:12

标签: javascript webrtc

我有一个webrtc应用程序,它工作正常,但出于测试目的,我需要测试我的TURN服务器是否工作,但因为两个测试设备都在同一个网络中,我无法测试,想到下面的代码会将候选人限制为仅使用TURN服务器的人,

function onIceCandidate(event, targetSessionID, targetUserName) {
    if (event.candidate) {
    var candidate = event.candidate.candidate;
    if(candidate.indexOf("relay")<0){ // if no relay address is found, assuming it means no TURN server
        return;
    }
    sendMessage(candidate); // using socket.io to send to the otherside
...

但我注意到(非常沮丧),这不起作用,因为当peer创建答案描述时,

....
a=candidate:0 1 UDP 2128609535 13.198.98.221 58779 typ host
a=candidate:0 2 UDP 2128609534 13.198.98.221 58780 typ host
....

这意味着,通信是直接的,而不是通过TURN服务器,我假设这是正确的吗?现在,如何强制webrtc使用TURN服务器?

4 个答案:

答案 0 :(得分:6)

只需添加此内容即可结束问题,

function onIceCandidate(event, targetSessionID, targetUserName) {
    if (event.candidate) {
    var candidate = event.candidate.candidate;
    if(candidate.indexOf("relay")<0){ // if no relay address is found, assuming it means no TURN server
        return;
    }...

以上代码有效,已检查到wireshark

添加if(candidate.indexOf("relay")<0)条件后,只能通过TURN服务器进行通信,如果服务器不存在/错误的详细信息,则会在new

处获得连接状态

编辑:就像cullen在他的回答中所说,根据w3 webrtc,将relay作为iceTransportPolicy传递应该有效,但我还没有检查它是否在Firefox和Chrome中实现......

答案 1 :(得分:4)

我不知道浏览器是否或何时会支持这个但是看看draft-ietf-rtcweb-jsep-08的4.1.1节中的“ICE候选策略”,你可以看到如何将策略设置为“接力”会做你想要的。在当前的W3C API草案中,使用RTCIceTransports值“relay”为配置中的iceTranports字段设置。在https://w3c.github.io/webrtc-pc/

中搜索RTCIceTransports

答案 2 :(得分:0)

为了在firefox上进行测试,您可以强制使用TURN中继。

检查我的回答https://github.com/angular/in-memory-web-api/blob/master/in-memory-backend.service.js

答案 3 :(得分:0)

您现在可以使用 iceTransportPolicy 属性强制转弯

let pc = new RTCPeerConnection({ iceTransportPolicy : "relay" })

https://developer.mozilla.org/en-US/docs/Web/API/RTCConfiguration/iceTransportPolicy