2009-06-25 104 views
8

当Java创建一个Socket:如何查看/更改Linux上的套接字连接超时?

new Socket(host, port); 

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

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

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

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

感谢

+0

我认为最好在每个应用程序的基础上配置此超时。 否则,此机器中运行的所有其他应用程序都将受此设置的影响。 – Reginaldo 2009-06-25 20:31:34

+1

同意,我仍然想知道什么设置是我应该改变它。 – Kevin 2009-06-25 20:39:22

+1

如果你坚持改变操作系统设置,那么我认为这不再是一个编程相关的问题,属于服务器故障。 – akarnokd 2009-06-25 22:28:24

回答

7

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

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

0

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

4

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

2

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

如果Windows上的连接尝试立即失败,则很可能是路由器RST更强烈,或者ARP级别上的邻居被认为无法访问。在Windows上尝试使用arp -a -v命令查看无法访问的主机 - 这些主机会很快被拒绝。

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