如何模拟来自非阻塞客户端的连接以遇到 EINPROGRESS 错误?我可以从服务器做些什么来将此类错误返回给客户端(即调整一些 tcp 计时器、原始套接字服务器等。)
2 回答
当连接到 localhost TCP 总是立即连接,因此connect()
不返回EINPROGRESS
.
connect()
您可以通过“假装”返回EINPROGRESS
并等待客户端套接字准备好写入(就像在 之后连接)来模拟客户端EINPROGRESS
。事实上,一些库只是为了非阻塞而这样做,connect()
以避免立即连接和慢速连接的两种不同的代码路径。
我最近不得不做类似的事情,我遇到了这个线程。我使用 iptable 规则来解决我的问题。EINPROGRESS 不是服务器返回的东西。如果连接不能立即完成,则连接的返回码为 -1 并且错误号设置为 EINPROGRESS。一旦 connect 发出 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
请记住,这仅在您不希望连接完成时才有效。