【问题标题】:Socket keep alive not working on LinuxSocket保持活动在Linux上不起作用
【发布时间】: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


【解决方案1】:

(我知道这更像是一条评论,但我没有足够的声誉来添加评论。请不要给我投反对票。)

我建议您可以在 linux 上使用“netstat -anpo”来检查 keepalive Timer 是否真的为您的连接打开了。如果启用,它将在“计时器”列中显示“keepalive”。否则它会“关闭”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 2021-05-26
    • 2018-09-14
    • 2018-11-03
    • 1970-01-01
    相关资源
    最近更新 更多