C# 为什么System.Net.Sockets.Socket.AcceptationSync在长时间不活动后完成连接重置?

C# 为什么System.Net.Sockets.Socket.AcceptationSync在长时间不活动后完成连接重置?,c#,.net,sockets,asynchronous,C#,.net,Sockets,Asynchronous,当您使用有效的SocketAsyncEventArgs调用Socket.AcceptsSync并正确地装配了SocketAsyncEventArgs.Completed事件,并且在很长一段时间内不接受任何连接时,它只是重置连接。但是,我的Socket.ReceiveTimeout和Socket.SendTimeout都是零 我不确定如何设置接受连接的超时时间,即使这是个好主意。是否有人有一个解决方法,也许还有一些关于为什么这是默认行为的信息 我在Microsoft Connect上查看他们是否有

当您使用有效的
SocketAsyncEventArgs
调用
Socket.AcceptsSync
并正确地装配了
SocketAsyncEventArgs.Completed
事件,并且在很长一段时间内不接受任何连接时,它只是重置连接。但是,我的
Socket.ReceiveTimeout
Socket.SendTimeout
都是零

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


我在Microsoft Connect上查看他们是否有超时时间不稳定的原因。有时它会在五分钟内超时,有时超过两个小时

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

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

这可能有助于:

如果套接字超时,您还可以每隔几秒(分钟)向其发送保持活动的数据包

您还可以使用Netstat-an | findstr/i“PORT#”监视连接。有关这方面的信息,请访问:


我希望这有助于解决您的问题。

您是否已检查wireshark或其他设备的线路状况?ConnectionReset应该与某个已连接的套接字相关,而不是侦听套接字。我最初假设的是相同的,这就是为什么我对此感到如此困惑的原因。我正在使用wireshark日志进行测试,并将在测试结果出现时发布。@NikolaiNFetissov你搞定了。终于找到了问题的根源。你认为应该如何处理?您应该捕获异常,释放资源,然后再次开始接受。如果需要阻止SYN扫描,则需要一个支持有状态数据包检查和自动流量过滤的防火墙,或者一些非常激进的防火墙规则。