【问题标题】:Why does System.Net.Sockets.Socket.AcceptAsync complete with ConnectionReset after a long time of inactivity?为什么长时间不活动后 System.Net.Sockets.Socket.AcceptAsync 会通过 ConnectionReset 完成?
【发布时间】:2012-01-05 23:44:30
【问题描述】:

似乎当您使用有效的SocketAsyncEventArgs 调用Socket.AcceptAsync 并正确操纵SocketAsyncEventArgs.Completed 事件并且在很长一段时间内不接受任何连接时,它只会重置连接。不过,我的Socket.ReceiveTimeoutSocket.SendTimeout 都是零。

我不确定如何设置接受连接的超时时间,即使这是个好主意。有没有人有解决方法,也许有一些关于为什么这是默认行为的信息?

我在 Microsoft Connect 上filed a bug report 看看他们是否有任何原因导致超时时间不稳定。有时它会在五分钟内超时,有时会超过两个小时。

【问题讨论】:

  • 你用wireshark或其他东西检查过电线上发生了什么吗? ConnectionReset 应该与某个连接的套接字有关,而不是与侦听套接字有关。
  • 我最初也是这么认为的,这就是为什么我对此感到非常困惑。当我们说话时,我正在使用wireshark日志记录进行测试,并会在发生时发布结果。
  • @NikolaiNFetissov 你成功了。终于找到了问题的根源。

标签: c# .net sockets asynchronous


【解决方案1】:

玩了一会儿之后,我发现单个 SYN -> SYN-ACK -> RST 序列将引发SocketAsyncEventArgs.Completed 事件并导致SocketAsyncEventArgs.SocketError 属性变为SocketError.ConnectionReset。看起来这是预期的行为,但它绝对是一个陷阱,应该更好地记录。

任何人扫描您的服务器端口并进行半开 SYN 类型扫描都会产生类似的流量并导致同样的问题。为了防止软件中的拒绝服务漏洞,应该处理这种特殊情况。

【讨论】:

  • 你觉得应该怎么处理?只是吞下异常还是关闭连接?
  • @HarryMexican 您应该捕获异常,释放资源,然后再次开始接受。如果你需要阻止 SYN 扫描,你需要一个支持状态包检测和自动流量过滤的防火墙,或者一些非常激进的防火墙规则。
【解决方案2】:

也许这会有所帮助: Socket problem: TcpClient.GetStream with ReceiveTimeout throws Exception and connected state become false

如果套接字超时,您也可以每隔几秒(分钟)发送一次保持活动数据包。

您还可以使用 Netstat -an | 密切关注连接。 findstr /i "端口#"。您可以在以下位置找到相关信息: TCP Connection States and Netstat Output

我希望这有助于找出您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    相关资源
    最近更新 更多