什么会导致UDP套接字上的ConnectionReset



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

尽管lib与示例RTSP提要配合使用很好,但当使用我的机顶盒中的提要时,RTP侦听器套接字(一个简单的UDP套接字,侦听特定端口上的每个收入(会抛出SocketException:ConnectionReset,当然在接收时不会显示数据(数据显示在Wireshark中(。

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

是什么导致了这种行为?

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

Microsoft解释SIO_UP_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:

wsaeconreset

虚拟电路由远程侧执行硬或流产关闭。应用程序应关闭套接字;不是使用时间更长在UDP数据报套接字上,此错误表示以前的发送操作导致ICMP端口无法访问消息

我是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派生,并创建一个能够优雅处理这一问题的FreeboxRtspCClient和FreeboxRtpClient。

如果有人能找到盒子在不同端口发送数据包的原因,我很乐意对当前的实现进行更改,这样就不需要派生了。

附于此:http://net7mma.codeplex.com/workitem/16024

您可以找到显示整个对话的Pcap捕获。

-Jay

最新更新