TCP:从服务器端(linux)模拟EINPROGRESS



如何模拟来自非阻塞客户端的连接以遇到 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

请记住,这仅在您不希望连接完成时才有效。

最新更新