【发布时间】:2012-04-14 04:31:15
【问题描述】:
我们有一个 Java 应用程序使用启用了 TCP 保持活动的套接字
Socket.setKeepAlive(true) http://docs.oracle.com/javase/6/docs/api/java/net/Socket.html#setKeepAlive(boolean)
我们的测试表明,keep alive 功能在 Windows 主机上正常工作,但在 Linux 主机 (Ubuntu Lucid) 上却不行。
深入研究发现Java中使用的SO_KEEPALIVE数值常量似乎与Linux中使用的常量不匹配
在java中:jdk/src/share/classes/java/net/SocketOptions.java:
public final static int SO_KEEPALIVE = 0x0008;
在 Solaris 中:include/sys/socket.h
#define SO_KEEPALIVE 0x0008 /* keep connections alive */
在 Linux Sparc、MIPS、Alpha 和 PARISC 中:/usr/src//linux-headers-2.6.32-19/arch/sparc/include/asm/socket.h:
#define SO_KEEPALIVE 0x0008
在其他 Linux(x86 和 amd64)中:/usr/include/asm-generic/socket.h:
\#define SO_KEEPALIVE 9
我们认为这可以解释为什么 keep alive 不能在 Linux 上运行。任何人都可以提出其他原因或解决方案吗?
干杯 马克
【问题讨论】:
-
SocketOption 值无关紧要,它映射到本机代码中的平台特定值。
-
您尝试过哪些不同的主机/客户端配置?保持活动的超时可能因平台而异。可能是linux主机超时时间较长,客户端机器因为认为连接死了而终止连接。
标签: java linux sockets tcp keep-alive