vid*_*guy 11 sockets android iptables localhost portforwarding
我有一个创建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);
}
Run Code Online (Sandbox Code Playgroud)
现在我不确定System.setProperty()调用是否真的改变了上面代码读取的值.
理论上,IPv6 服务器也侦听 IPv4,因为 IPv4 地址空间是 IPv6 的子集,这会给您带来真正的问题吗?
一个可能有效的技巧是使用“127.0.0.1”而不是“localhost”,它具有关联的 IPv4 和 IPv6 地址。
| 归档时间: |
|
| 查看次数: |
3794 次 |
| 最近记录: |