2

我正在尝试使用托管媒体聚合 C# 库 ( http://net7mma.codeplex.com ) 来处理来自 Freebox 机顶盒的 RTSP/RTP 流。

尽管该库可以与示例 RTSP 提要一起正常工作,但在使用来自我的机顶盒的提要时,RTP 侦听器套接字(一个简单的 UDP 套接字侦听特定端口上的每个收入)抛出 SocketException:ConnectionReset,当然没有数据在接收时显示(数据显示在 Wireshark 中)。

通过 SocketIO 技巧抑制 E_CONNRESET 并没有太大作用,仍然没有数据进入套接字。

什么会导致这种行为?

(如有必要,我可以提供来源或 Wireshark 跟踪)

4

2 回答 2

8

微软解释SIO_UDP_CONNRESET的真正含义:

SIO_UDP_CONNRESET(操作码设置:I,T==3)

Windows XP:  Controls whether UDP PORT_UNREACHABLE messages are reported.
- Set to TRUE to enable reporting.
- Set to FALSE to disable reporting.

问题实际上不是连接重置而是可达性

MSDN 解释错误 WSAECONNRESET:

WSAECONNRESET

虚电路被远程端执行硬或异常关闭复位。应用程序应该关闭套接字;它不再可用。在 UDP 数据报套接字上,此错误表明先前的发送操作导致 ICMP 端口不可达消息

于 2013-03-05T19:12:55.367 回答
1

我是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 捕获。

-杰伊

于 2013-03-07T16:10:22.813 回答