11

我有一个服务,它创建一个 ServerSocket 并绑定到localhost:7060. 当我在我的 android 设备上执行“netstat -an”时,我看到它使用的是 ipV6 localhost 而不是 ipv4 localhost 接口。

输出是这样的:
tcp6 0 0 ::ffff:127.0.0.1:7060 :::* LISTEN

使用 ipV4 的端口如下所示:
tcp 0 0 127.0.0.1:5060 0.0.0.0:* LISTEN

强制它始终使用 IPv4 的诀窍是什么?我正在使用 iptables 设置端口转发规则。我拥有的版本支持 ipv4 目标地址。

这就是我创建用于侦听端口的 Java 代码的方式。

InetAddress localAddress = Inet4Address.getByName("localhost"); //InetAddress localAddress = Inet4Address.getLocalHost(); sockServer = new ServerSocket(nPort, 20, localAddress);

我遵循了其他建议,例如在我的服务启动时设置系统属性以首选 ipV4。那没有任何区别。

System.setProperty("java.net.preferIPv4Stack", "true");

我在为嵌入式设备构建的 Android 2.3 上运行它。

更新:我检查了 android 树中的 InetAddress.java 源。它正在读取上面的标志,如下所示。

static boolean preferIPv6Addresses() {
        String propertyName = "java.net.preferIPv6Addresses";
        String propertyValue = AccessController.doPrivileged(new PriviAction<String>(propertyName));
        return Boolean.parseBoolean(propertyValue);
    }

现在我不确定 System.setProperty() 调用是否真的改变了上面代码读取的值。

4

1 回答 1

2

理论上,IPv6 服务器也会监听 IPv4,因为 IPv4 地址空间是 IPv6 的子集,这会给您带来真正的问题吗?

一个可行的技巧是使用“127.0.0.1”而不是“localhost”,后者关联了 IPv4 和 IPv6 地址。

于 2013-05-10T01:43:06.057 回答