【问题标题】:Is there a way to access the SOL_TCP (AKA IPPROTO_TCP) socket options (e.g. TCP_KEEPIDLE) in Java?有没有办法在 Java 中访问 SOL_TCP(AKA IPPROTO_TCP)套接字选项(例如 TCP_KEEPIDLE)?
【发布时间】:2012-08-24 15:24:37
【问题描述】:

我希望能够设置 TCP 套接字 KEEPALIVE 参数(TCP_KEEPIDLE、TCP_KEEPINTVL 和 TCP_KEEPCNT),但这些似乎在 Socket 类中不可用。根据SocketImplSocketOptions 类的文档以及this page 底部的实现细节,我得出结论,库实现者硬编码了@987654325 的“级别”参数@ 到 SOL_SOCKET,这使得无法访问其他级别的选项,例如 SOL_TCP/IPPROTO_TCP。我是否缺少另一个处理这些选项的 Java 类?如果没有,有什么方法可以获取原始文件描述符编号,以便我可以通过 JNI 将其传递给一些直接调用 setsockopt 的 C 代码,因为它似乎无法从 FileDescriptor 获得?

【问题讨论】:

    标签: java sockets tcp


    【解决方案1】:

    这些都是非可移植的 Linux 特定选项,这可能是它们在跨平台语言库中不可用的原因。尽管它们中的大多数在 proc(5)sysctl(2) 选项中都有各自的条目。

    【讨论】:

    • 我希望他们留下的东西可以让程序员取消安全功能,只需将适当的协议和操作编号作为整数传递给原始实现,但我猜没有这样的运气.感谢您指出这些是特定于 Linux 的;我原以为 POSIX 对此的支持更完整。
    【解决方案2】:

    您要查找的联机帮助页是 tcp(7)。 请注意,使用 IPPROTO_TCP 代替 SOL_TCP 更安全

    【讨论】:

    • 感谢指点;我已经更新了正文中的问题和一些信息,但我认为这不会改变最终结果,因为 KEEPALIVE 值在 SocketOptions 中不可用。我想我可以尝试在从 SocketOptions 构造时设置原始 int 值。在我编写代码的麻烦之前对这种方法有什么看法?
    猜你喜欢
    • 2014-04-23
    • 2016-05-21
    • 2010-10-25
    • 1970-01-01
    • 2013-05-12
    • 2019-12-21
    • 2018-02-23
    • 2014-12-22
    相关资源
    最近更新 更多