gpt4 book ai didi

android - 为什么我的服务总是绑定(bind)到 ipv6 localhost 而不是 ipv4?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:49:32 37 4
gpt4 key购买 nike

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

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

使用ipV4的端口如下:
tcp 0 0 127.0.0.1:5060 0.0.0.0:* 收听

强制它始终使用 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() 调用是否真的改变了上面代码读取的值。

最佳答案

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

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

关于android - 为什么我的服务总是绑定(bind)到 ipv6 localhost 而不是 ipv4?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8319399/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com