套接字保持活动状态在 Linux 上不起作用

Mar*_*arc 2 java sockets linux tcp keep-alive

我们有一个 Java 应用程序,它使用启用了 TCP 保持活动状态的套接字

Socket.setKeepAlive(true) http://docs.oracle.com/javase/6/docs/api/java/net/Socket.html#setKeepAlive(boolean )

我们的测试表明,保持活动功能在 Windows 主机上可以正常工作,但在 Linux 主机 (Ubuntu Lucid) 上则无法正常工作。

深入研究后发现,Java 中使用的 SO_KEEPALIVE 数值常量似乎与 Linux 中使用的常量不匹配

在java中:jdk/src/share/classes/java/net/SocketOptions.java:

public final static int SO_KEEPALIVE = 0x0008;
Run Code Online (Sandbox Code Playgroud)

在 Solaris 中:include/sys/socket.h

#define    SO_KEEPALIVE    0x0008        /* keep connections alive */
Run Code Online (Sandbox Code Playgroud)

在 Linux Sparc、MIPS、Alpha 和 PARISC 中:/usr/src//linux-headers-2.6.32-19/arch/sparc/include/asm/socket.h:

#define SO_KEEPALIVE    0x0008
Run Code Online (Sandbox Code Playgroud)

在其他 Linux(x86 和 amd64)中:/usr/include/asm-generic/socket.h:

\#define SO_KEEPALIVE    9
Run Code Online (Sandbox Code Playgroud)

我们认为这可以解释为什么 keepalive 在 Linux 上不起作用。谁能提出另一个原因或解决方案?

干杯马克

小智 5

我建议你可以在 Linux 上使用“netstat -anpo”来检查你的连接的 keepalive 计时器是否真的打开了。如果启用,则会在“定时器”栏中显示“keepalive”。否则就“关”了。