我有两个要通过WebRTC相互连接的同级。通常,第一个对等方将创建要约,并通过信令渠道/服务器将其发送给第二个,第二个对等方将回答。这种情况下工作正常。
但是,有可能支持这样一种情况,即两个对等点碰巧试图同时彼此连接,并且两者都通过信令服务器同时发送SDP提议。
// Both peers do this simultaneously:
const conn = new RTCPeerConnection(null);
const sdpOffer = await conn.createOffer();
await conn.setLocalDescription(sdpOffer);
signalingService.send(peerId, sdpOffer);
// At some point in the future both peers also receive an SDP offer
// (rather than answer) from the other peer whom they sent an offer to
// via the signaling service. If this was an answer we'd call
// RTCPeerConnection.setRemoteDescription, however this doesn't work for an
// offer:
conn.setRemoteDescription(peerSDPOffer);
// In Chrome results in "DOMException: Failed to execute 'setRemoteDescription' on 'RTCPeerConnection': Failed to set remote offer sdp: Called in wrong state: kHaveLocalOffer"
我什至试图通过将SDP类型从offer
重写为answer
,将setup:actpass
重写为setup:active
来“转换”接收的对等方提供的答案,但这并没有似乎有效,相反,我得到了一个新的例外。
问题是,是否以某种方式支持此同时连接/提供用例-还是我这次应该关闭一侧/对等RTCPeerConnection并使用RTCPeerConnection.createAnswer
实例化一个新的?
答案 0 :(得分:3)
这种情况被称为“信号眩光”。 WebRTC API并未真正定义处理方式(除了称为“回滚”的东西,但尚未在任何浏览器中实现,并且到目前为止没有人错过它),因此您必须自己避免这种情况。
仅替换a = setup无效,因为底层的DTLS机制仍然需要客户端和服务器的概念。