如何模拟来自非阻塞客户端的连接以遇到 EINPROGRESS 错误?我可以从服务器做什么来将此类错误返回给客户端(即调整一些 tcp 计时器、原始套接字服务器等)。
当连接到本地主机时,TCP 总是立即连接,因此connect()
不会返回EINPROGRESS
。
您可以通过"假装"connect()
返回EINPROGRESS
并等待客户端套接字准备好写入(就像在EINPROGRESS
后连接一样)来模拟客户端中的这种情况。事实上,一些库只是对非阻塞connect()
这样做,以避免两个不同的代码路径用于即时连接和慢速连接。
我最近不得不做类似的事情,我遇到了这个线程。我使用iptable规则来解决我的问题。EINPROGRESS不是服务器返回的东西。如果连接无法立即完成,则来自连接的返回代码为 -1,错误编号设置为 EINPROGRESS。连接发出 SYN 数据包后,您的连接将完成(假设您正在连接到有效的 IP 地址,并且网络的其他一切都正常)。
如果可以在客户端更改 iptables,则模拟 EINPROGRESS 的最简单方法是创建一个 iptable 规则,将传出 SYN 数据包丢弃到服务器的 IP 地址和端口。
iptables -A OUTPUT -p tcp --tcp-flags SYN,ACK,FIN,RST SYN -d serverip --dport serverport -j DROP
请记住,这仅在您不希望连接完成时才有效。