首页 > 解决方案 > C# 中的简单 Webrtc 中继桥服务器

问题描述

我有一个完全工作的 peerTopeer (P1, P2) webRTC。为了处理 peerTopeer 故障,我正在尝试通过 c# 中的服务器在 Windows 机器上的 P1 和 P2 之间进行简单的字节交换,因为我不想按规范开发转向服务器。我还尝试找到一个带有转消息但它不工作的开源 c# 服务器转服务器(能够解析请求,但响应似乎不被最新的 chrome/MS Edge chromium 接受)

简单的 C# 中继桥服务器:

通过简单的 udp/tcp 侦听器并与对等方交换字节(P1 到 P2 和 P2 到 P1)并强制桥接机器 IP 作为候选,我能够实现连接和流数据(字节)被交换。但是,无法在对等方上看到视频/听到音频,并且在进行了一些交换之后,连接被丢弃,客户端连接状态失败

Q1。它应该工作,出了什么问题?

Q2。任何 stun and turn 的开源 c# 实现(简单的一个)?

我感谢在这方面的任何帮助。


服务器和客户端代码示例:

收听 tcp / udp(不在示例中)

public void ListenTCP(int port) {
        TcpListener listener = new TcpListener(IPAddress.Any, port);
        listener.Start();
        while (true){
            TcpClient tcpClient = listener.AcceptTcpClient();
            ..........add endpoint to list
            var bytes = readfromtcpstream.......;
            Task.Run(() => ProcessData(tcpClient.Client.RemoteEndPoint, bytes));
        }
    }

ProcessData(交换流字节)

private void Process_DATA(IPEndPoint fromEndPoint, byte[] bytes) {
        foreach (var endpoint in list) { //distribute to all other peers
            if (endpoint == fromEndPoint) continue;
            endpoint's TCPClient.Send(bytes);
        }
    }

在客户端(Javascript / typescript),强制候选人作为桥接服务器

SignalType.Candidate...
candidate = new RTCIceCandidate(Switch the SDP(messageJson.candidate,
                    BridgeServerAddress, "2525", "tcp"));
m_PeerConnection.addIceCandidate(candidate)

标签: c#serverwebrtcrelayturn

解决方案


简单地修改你从 P2P 获得的候选冰不太可能工作,因为 TCP 候选的工作方式有点不同。TURN 服务器与简单的网桥有很大不同。

下面的 SDP 包含一个 tcptype 被动的 TCP 候选,它将使另一端建立到它的连接。将其输入 setRemoteDescription,然后创建一个答案并使用答案调用 setLocalDescription。

v=0
o=- 2576067654554894849 3 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE audio
a=msid-semantic: WMS
m=audio 9 UDP/TLS/RTP/SAVPF 111
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=candidate:2698387310 1 tcp 25042943 127.0.0.1 31337 typ host tcptype passive generation 0
a=ice-ufrag:server
a=ice-pwd:Kv6yCw1HiZ1/6uNExYcE28pO
a=fingerprint:sha-256 22:46:36:8D:B1:CD:08:7B:A1:60:86:BF:95:90:06:4B:EA:47:D9:74:24:FF:6D:2F:1C:09:5B:C1:F5:8D:CC:B2
a=setup:actpass
a=mid:audio
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=recvonly
a=rtcp-mux
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1

浏览器应该在 localhost 上建立与端口 31337 的连接(请注意,Firefox 默认不允许 localhost ICE,因此请先在 Chrome 中尝试此操作)。从那里,您必须处理 ICE、解密 SRTP 等。


推荐阅读