如何减少TCP connect()系统调用超时?

Mar*_*tin 4 bash tcp connection-timeout

在下面的命令中,我同时启用文件/dev/tcp/10.10.10.1/80读写功能并将其与文件描述符3关联:

$ time exec 3<>/dev/tcp/10.10.10.1/80
bash: connect: Operation timed out
bash: /dev/tcp/10.10.10.1/80: Operation timed out

real    1m15.151s
user    0m0.000s
sys     0m0.000s
Run Code Online (Sandbox Code Playgroud)

这将自动尝试执行TCP三向握手。如果如上例所示无法访问10.10.10.1,则connect系统调用将尝试连接75秒钟。这75秒的超时时间是由确定的bash吗?还是该系统默认?最后但并非最不重要的一点是,有没有办法降低此超时值?

ken*_*orb 5

如前所述,在Bash中不修改源代码是不可能的,尽管这是使用timeout命令的解决方法,例如:

$ timeout 1 bash -c "</dev/tcp/stackoverflow.com/80" && echo Port open. || echo Port closed.
Port open.
$ timeout 1 bash -c "</dev/tcp/stackoverflow.com/81" && echo Port open. || echo Port closed.
Port closed.
Run Code Online (Sandbox Code Playgroud)

使用此语法,timeout命令将在给定时间后终止进程。

请参阅:timeout --help更多选项。

  • 这应该是一个可以接受的答案,而不是在`/ proc / sys / net / ipv4 / tcp_keepalive_time`上广泛地更改值(不推荐),这真是让我们知道发送信号给打开套接字的进程的父进程将关闭它。我想知道为什么这行得通,并且`$ timeout 1 &lt;/dev/tcp/stackoverflow.com/81 &amp;&amp; echo Port open。' (2认同)

use*_*421 1

这是由TCP决定的。可以通过应用程序代码按每个插槽减少它。

注意:只有在完全没有响应的情况下,超时才会生效。如果连接被拒绝,错误会立即发生。

  • 我不知道有任何这样的 bash 设置。 (2认同)