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 (将#修改为@)