2011-11-29 39 views
11

我有一个服务创建一个ServerSocket并绑定到localhost:7060。当我在我的android设备上执行“netstat -an”时,我发现它使用的是ipv6 localhost而不是ipv4 localhost接口。为什么我的服务总是绑定到ipv6 localhost而不是ipv4?

输出是这样的:
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()调用真正改变由上面的代码读取值。

+0

我认为这些系统属性是在操作系统本身,并以编程方式更改它们不会坚持(因为所有的应用程序都依赖于相同的系统属性)。 –

+2

(因为这个老的线程被其他地方引用了,我想需要一些说明。)':: 1'是IPv6本地主机地址。 ':: ffff:127.0.0.1'不是,它是IPv6表示法中的IPv4本地主机地址(所谓的“IPv4映射”IPv6地址)。它用于可以接受IPv4和IPv6数据包的双堆栈套接字。 (尽管套接字应该标记为“tcp46”,然后。) – Dubu

回答

2

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

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

相关问题