我是net7mma的作者。
我非常感谢您在尝试解决此问题方面的帮助。
WinSock 或 Windows 网络堆栈的其他部分可能存在错误。我很想知道这是否发生在 Mono Also 上。
但是,根据与 OP 的一些对话,这似乎发生的原因是 Freebox 在端口上发送数据包,该端口与描述请求中指示的端口不同。
当我有机会在我的项目页面上发布一些关于这个的信息时,我想确保人们搜索这个和 Freebox 得到最好的信息。
在RtpClient -> RecieveData
改变 :
received = socket.Receive(m_Buffer, received, Math.Min(socket.Available, m_Buffer.Length), SocketFlags.None, out error);
至
var tc = GetContextBySocketHandle(socket.Handle);
EndPoint fbRtp = new IPEndPoint(tc.RemoteRtp.Address, 0);//Any port
received = socket.ReceiveFrom(m_Buffer, SocketFlags.None, ref fbRtp);
这应该允许您的套接字在任何端口上接收,因为 stb 没有正确报告 rtp 或 rtcp 端口,如果您有超过 1 个客户端并且您决定使用此代码,请小心,因为您可能会无意中接收来自另一个流的数据包或即使您只使用单个客户端,同一流的 Rtcp 端口也可能无意中在此接收中偷偷发送数据包。
如果可行,最好的做法是从 RtspClient 和 RtpClient 派生并制作一个可以优雅地处理此问题的 FreeboxRtspClient 和 FreeboxRtpClient。
如果有人可以找到盒子在不同端口上发送数据包的原因的押韵,我很乐意在当前实现中进行更改,因此不需要推导。
附在这里: http: //net7mma.codeplex.com/workitem/16024
您可以找到显示整个对话的 Pcap 捕获。
-杰伊