【发布时间】:2012-05-01 00:14:43
【问题描述】:
如何模拟来自非阻塞客户端的连接以遇到 EINPROGRESS 错误? 我可以从服务器做些什么来将此类错误返回给客户端(即调整一些 tcp 计时器、原始套接字服务器等)
【问题讨论】:
标签: linux sockets networking tcp raw-sockets
如何模拟来自非阻塞客户端的连接以遇到 EINPROGRESS 错误? 我可以从服务器做些什么来将此类错误返回给客户端(即调整一些 tcp 计时器、原始套接字服务器等)
【问题讨论】:
标签: linux sockets networking tcp raw-sockets
我最近不得不做类似的事情,我遇到了这个帖子。我使用 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
请记住,这仅在您不希望连接完成时才有效。
【讨论】:
当连接到 localhost 时,TCP 总是立即连接,因此 connect() 不会返回 EINPROGRESS。
您可以通过“假装”connect() 返回EINPROGRESS 并等待客户端套接字准备好写入(就像在EINPROGRESS 之后连接一样)来模拟客户端。事实上,一些库只是为非阻塞 connect() 这样做,以避免立即和慢速连接使用两种不同的代码路径。
【讨论】: