如何解决Windows套接字:如何在非阻塞connect上立即检测TCP RST?
我们的软件(Nmap port scanner)需要快速确定无阻塞TCP套接字connect()
的状态。我们使用select()
来监视许多套接字,Windows会在成功时通知我们。但是,如果端口关闭并且目标发送TCP RST,则Windows将继续尝试几次,然后通知exceptfds
,并且套接字错误为预期的WSAECONNREFUSED
。但是,我们的应用程序有自己的超时时间,通常会在Windows放弃之前将连接标记为超时。我们希望尽可能接近Linux的行为,即在收到第一个RST后立即用ECONNREFUSED
进行通知。
我们尝试使用TCP_MAXRT
socket option,这可以使select()
立即向我们发送信号,但是结果(对于封闭端口)始终为WSAETIMEDOUT
,这使得不可能区分关闭(RST)和已过滤/防火墙(网络超时),这使我们回到了最初的问题。确定这种区别是我们应用程序的核心功能。
那么,在Windows上找出非阻塞套接字connect()
是否已收到连接重置的最佳方法是什么?
编辑为补充:此处的核心问题是Microsoft文档中关于SO_ERROR
套接字选项的这一行:“此套接字错误代码并非总是立即设置的。如果立即设置,我们可以在连接超时之前进行检查。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。