问题描述
假设两个对等方和只有一个DataChannel之间存在一个WebRTC连接(RTCPeerConnection),使用sdp-transform,我有以下代码:
const sdp = sdpTransform.parse(this.connection.currentRemoteDescription.sdp);
console.log(sdp.media[0].protocol+"://"+sdp.media[0].connection?.ip+":"+sdp.media[0].port);
我希望获得我连接的对等方的IP和远程端的端口。但是,相反,我得到了错误的值,例如,我得到了TURN服务器IP,并且我确定连接不是通过TURN服务器进行的,因为我测量了DataChannel上的延迟(即连接是直接在同一WiFi网络上)。如果禁用TURN服务器,则将0.0.0.0
作为远程IP,而我希望获得远程对等方的WiFi分配的IP(例如:192.168.0.53
)。这是在两台设备上使用最新的Chrome。
我唯一获得准确结果的方法是,如果没有TURN服务器,并且两个设备都未连接到同一WiFi,则在sdp.media[0].connection?.ip
中报告远程对等方的外部IP。
解决方法
通常,您不能。
在建立对等连接之前,两个对等方交换 ICE候选对象,其中包括希望与之联系的地址。如果远程对等方仅包含TURN服务器的地址,则本地对等方将不了解有关其自身地址的任何信息。
但是,在大多数情况下,远程对等点还将包括包含其自己地址的ICE候选对象。原则上,您可以通过检查ICE候选者来找到远程对等方的地址-检查onicecandidate
回调。