【问题标题】:Unble to use InetAddress.isReachable(timeout) for IPv6 when java.net.preferIPv4Stack=true当 java.net.preferIPv4Stack=true 时,无法将 InetAddress.isReachable(timeout) 用于 IPv6
【发布时间】:2018-05-05 10:25:03
【问题描述】:

在 Linux 中,我默认通过设置 java.net.preferIPv4Stack=true 来禁用 IPv6 支持,仅在应用程序中支持 IPv4。

但是,我现在想使用 InetAddress.isReachable(timeout) 访问外部 IPv6 IP,但它完全失败了,只有在我设置 java.net.preferIPv4Stack=false 时才有效。

有没有办法达到 IPv6 IP,但仍然保持 java.net.preferIPv4Stack=true?

谢谢

【问题讨论】:

    标签: java ipv6


    【解决方案1】:

    不,这是不可能的,因为您设置的选项explicitly disables communication with IPv6 only hosts:

    java.net.preferIPv4Stack(默认:false)

    如果 IPv6 在操作系统上可用,则默认情况下,底层本机套接字将是一个 IPv6 套接字,它允许应用程序连接到 IPv4 和 IPv6 主机并接受来自 IPv4 和 IPv6 主机的连接。但是,如果应用程序宁愿只使用 IPv4 套接字,则可以将此属性设置为 true。 这意味着应用程序无法与仅 IPv6 的主机进行通信。

    如果您想确保 IPv4 地址优先于 IPv6 地址,但仍有可用的 IPv6,那么您很幸运 - 这是默认行为! (如果您出于任何原因想要将其更改为首选 IPv6 地址,您可以设置 java.net.preferIPv6Addresses=true。)

    【讨论】:

    • 如果我使用Java的默认设置(java.net.preferIPv4Stack=false & java.net.preferIPv6Addresses=false),它可以到达IPv6。但是,在 Jboss/Wildfy 中,我们仍然面临 JGroup 的其他问题。
    • 2018-05-05 22:10:17,885 错误 [ServerService 线程池 -- 3]-[org.jboss.modcluster] MODCLUSTER000034:无法启动广告侦听器:java.net.SocketException:坏IP_MULTICAST_IF 的参数:地址未绑定到任何接口
    • @user1525949 听起来你有很多错误要修复。如果您需要他们的帮助,您应该提出单独的问题。
    • 如果您在启用 IPv6 时遇到问题,则说明您的应用程序出现问题。启用 IPv6 应该是 2018 年的默认设置。我什至发现在 Java 中 IPv4 优于 IPv6 的偏好非常古老。
    猜你喜欢
    • 2013-10-01
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 2018-01-24
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    相关资源
    最近更新 更多