11

在 Java 中创建 Socket 时:

new Socket(host, port);

Socket 构造函数将在返回之前尝试连接到host:port 。在 Windows 上,对于无法访问的主机,这几乎会立即失败,但对于 Linux,Socket 可能需要 5 分钟才能超时。

我知道,如果我可以控制创建套接字,我可以这样做:

Socket s = new Socket();
s.bind(..);
s.connect(.., timeout);

但我宁愿让操作系统使用合理的默认值。有没有办法在 Linux 上更改此设置?

谢谢

4

4 回答 4

13

我想你想要/proc/sys/net/ipv4/tcp_syn_retries。默认值通常为 5 或 6,即大约 3 分钟。

请注意,这些是系统范围的。

于 2009-06-25T20:49:52.390 回答
4

我建议不要更改操作系统设置,因为它可能会意外影响其他应用程序。该Socket.setSoTimeout()方法也可能对您有所帮助。

于 2009-06-25T20:56:21.053 回答
2

顺便说一句,Linux 和 Windows 在这里的行为不同,这并不完全正确。除了最初的 SYN 重试(可以在 Linux 和 Windows 上配置)外,邻居状态以及其他发送 RST 数据包的路由器也起作用。

如果 Windows 上的连接尝试立即失败,则很可能是路由器对它进行了 RST 八次 RST,或者邻居在 ARP 级别上被识别为不可访问。在 Windows 上尝试该arp -a -v命令以查看无法访问的主机 - 很快就会被拒绝。

对于 Linux,您将使用ip neigh列出本地网络上站点的可达性状态。

于 2011-09-08T03:24:47.500 回答
0

据我了解,这取决于系统的 TCP/IP 默认超时(默认为 24​​0 秒?)...一种选择是尝试调整这些,但这可能会影响同一台机器上依赖超时值的任何其他程序。在这种情况下,简单地降低 Java connect() 调用中的“超时”值可能会更安全。

于 2009-06-25T20:36:24.227 回答