为什么我的服务总是绑定到ipv6 localhost而不是ipv4?

时间:2011-11-29 23:47:53

标签: android sockets localhost iptables portforwarding

我有一个创建ServerSocket并绑定到localhost:7060的服务。当我做的时候" netstat -an"在我的Android设备上,我看到它使用的是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()调用是否真的改变了上面代码读取的值。

1 个答案:

答案 0 :(得分:2)

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

可能有用的技巧是使用“127.0.0.1”而不是“localhost”,它具有关联的IPv4和IPv6地址。