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

时间:2012-04-19 13:09:12

标签: linux sockets networking tcp raw-sockets

如何模拟来自非阻塞客户端的连接以体验EINPROGRESS错误? 我能从服务器做什么来将这样的错误返回给客户端(即调整一些tcp定时器,原始套接字服务器等等。)

2 个答案:

答案 0 :(得分:1)

连接到localhost时,TCP始终立即连接,因此connect()不会返回EINPROGRESS

您可以通过“假装”connect()返回EINPROGRESS并等待客户端套接字准备好写入(就像在EINPROGRESS之后连接一样)来在客户端中模拟它。实际上,有些库只针对非阻塞connect()执行此操作,以避免两个不同的代码路径用于立即连接和慢速连接。

答案 1 :(得分:0)

最近我不得不做类似的事情,我遇到了这个话题。我使用iptable规则解决了我的问题。 EINPROGRESS不是服务器返回的内容。如果无法立即完成连接,则connect的返回码为-1,错误号设置为EINPROGRESS。连接发送完SYN数据包后,您的连接将完成(前提是您要连接到有效的IP地址,并且网络上的其他一切正常)。

如果可以在客户端更改iptables,则模拟EINPROGRESS的最简单方法是创建iptable规则,以将传出的SYN数据包丢弃到服务器的IP地址和端口。

iptables -A输出-p tcp --tcp-flags SYN,ACK,FIN,RST SYN -d serverip --dport serverport -j DROP

请记住,这仅在您不希望连接完成时才起作用。