看起来,当您使用有效的 SocketAsyncEventArgs
调用 Socket.AcceptAsync
并正确装配了 SocketAsyncEventArgs.Completed
事件时,没有连接接受了很长一段时间,它只是重置连接。虽然,我的 Socket.ReceiveTimeout
和 Socket.SendTimeout
都是零。
我不确定如何设置接受连接的超时时间,即使这是个好主意。有没有人有解决方法,也许还有一些关于为什么这是默认行为的信息?
我filed a bug report在 Microsoft Connect 上查看他们是否有任何理由支持超时期限不稳定的原因。有时它会在五分钟内超时,有时会超过两个小时。
最佳答案
在尝试了一段时间之后,我发现单个 SYN -> SYN-ACK -> RST 序列将引发 SocketAsyncEventArgs.Completed
事件并导致 SocketAsyncEventArgs.SocketError
属性变为 SocketError.ConnectionReset
。这似乎是预期的行为,但它绝对是一个陷阱,应该更好地记录下来。
任何端口扫描您的服务器并进行半开 SYN 类型扫描的人都会产生类似的流量并导致同样的问题。为了防止软件中的拒绝服务漏洞,应该处理这种特殊情况。
关于c# - 为什么 System.Net.Sockets.Socket.AcceptAsync 在长时间不活动后完成 ConnectionReset?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8263267/