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

标签 android sockets localhost iptables portforwarding

我有一个创建 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/

相关文章:

java - Java 和 Web 套接字中的 TimerTask

c - 构建自己的套接字 API 以通过 LoRaWAN 发送 UDP 数据包

azure - 通过 Azure 设置 SSL 证书后运行本地主机的问题

c# sockets 缺少数据

c# - ASP.NET 随机字符串出现在 URL 中

docker - TestCafe docker-对在主机localhost上运行的应用运行测试

android - 从 Activity 中膨胀 fragment

android - 如何在回收站 View 中显示嵌套(或 'tree')数据?

Android TextView 不在 ListView 中做换行(多行文本)

android - SecurityException : Not allowed to start service Intent act=com. google.android.c2dm.intent.REGISTER