【问题标题】:How to set socket option (TCP_KEEPCNT, TCP_KEEPIDLE, TCP_KEEPINTVL) in java or netty?如何在 java 或 netty 中设置套接字选项(TCP_KEEPCNT、TCP_KEEPIDLE、TCP_KEEPINTVL)?
【发布时间】:2014-04-23 17:58:32
【问题描述】:

在 C/Linux 中,很容易为每个 KEEPALIVE tcp 连接独立设置不同的套接字选项值。

TCP_KEEPCNT (Linux 2.4 起) TCP 在断开连接之前应发送的最大保活探测数。此选项不应在旨在可移植的代码中使用。

TCP_KEEPIDLE (Linux 2.4 起) 如果已在此套接字上设置了套接字选项 SO_KEEPALIVE,则在 TCP 开始发送 keepalive 探测之前连接需要保持空闲的时间(以秒为单位)。 此选项不应在旨在可移植的代码中使用。

TCP_KEEPINTVL(从 Linux 2.4 开始) 各个保活探测之​​间的时间(以秒为单位)。此选项不应在旨在可移植的代码中使用。

在netty或java中,如何设置socket的三个socket选项?我知道没有可移植的方法来解决它,但只有在 Linux 中,我可以设置那些套接字选项吗?

【问题讨论】:

标签: java linux sockets tcp netty


【解决方案1】:

给出的链接实际上并没有告诉您如何使用 JNA 来实现它。在花了一段时间在 SO 上寻找解决方案后,我编写了自己的库。你可以找到它here

【讨论】:

    【解决方案2】:

    Java 11 似乎支持这一点,通过 new fields in the ExtendedSocketOptions class。这些可以传递给java.net.Socketjava.nio.channels.SocketChannel 上的setOption 方法。

    注意,我实际上并没有尝试过使用它。文档明确表示这些是特定于平台的,因此您需要测试它们在您关心的平台上实际执行您想要的操作。

    import java.net.Socket;
    import jdk.net.ExtendedSocketOptions;
    
    Socket socket = new Socket();
    socket.setOption(ExtendedSocketOptions.TCP_KEEPIDLE, 10);
    socket.setOption(ExtendedSocketOptions.TCP_KEEPCOUNT, 2);
    socket.setOption(ExtendedSocketOptions.TCP_KEEPINTERVAL, 3);
    

    【讨论】:

    【解决方案3】:

    最新版本的 Netty 允许您使用 epoll 类型的通道并设置 Linux 原生套接字选项,例如您提到的那些。

    详情请参阅documentation of EpollChannelOption

    【讨论】:

      猜你喜欢
      • 2017-05-30
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      • 2018-08-09
      • 1970-01-01
      • 2011-07-19
      • 2014-12-01
      • 1970-01-01
      相关资源
      最近更新 更多