什么会导致UDP套接字上的ConnectionReset
本文关键字:ConnectionReset 套接字 UDP 什么 | 更新日期: 2023-09-27 18:02:27
我正在尝试使用托管媒体聚合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