问题描述
我们的软件(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 (将#修改为@)