为什么android上的套接字服务器总是在IPv6上监听?

时间:2013-07-24 02:30:04

标签: android sockets ipv6 ipv4

我启动服务器套接字,希望它监听环回地址(127.0.0.1)。代码如下:     ......

Inet4Address address = (Inet4Address) Inet4Address.getByName("localhost");
TServerSocket server = new TServerSocket(new InetSocketAddress(address ,1234));
.........

public class TServerSocket{
......
  public TServerSocket(InetSocketAddress bindAddr, int clientTimeout) throws                TTransportException {
clientTimeout_ = clientTimeout;
try {
  serverSocket_ = new ServerSocket();
  serverSocket_.setReuseAddress(true);
  serverSocket_.bind(bindAddr);
} catch (IOException ioe) {
   serverSocket_ = null;
  throw new TTransportException("Could not create ServerSocket on address " +        bindAddr.toString() + ".");
 }
  }
   ......
}

但我发现这个套接字开始使用命令“netstat”侦听IPv6地址“:ffff:127.0.0.1”,它 导致在另一个进程(在Python中)运行的客户端无法通过“127.0.0.1”连接到此服务器。

为什么android会自动将IPV4地址映射到IPv6地址?

2 个答案:

答案 0 :(得分:0)

它没有将IPv4地址映射到IPv6。 Inet4AddressInet6Address没有实现getByName()方法,因此您实际上使用的是InetAddress中的继承方法。如果IPv4和IPv6都可以访问主机,则大多数操作系统都会选择IPv6 over IPv4(您应该这样:))。您可以尝试按InetAddress.getAllByName("localhost")获取地址数组,然后检查地址是Inet4Address的实例(或其他情况下为Inet6Address),但此示例的最简单解决方案是对环回进行硬编码地址(127.0.0.1),因为它几乎没有变化的可能性。

答案 1 :(得分:0)

它不是在监听IPv6本身,netstat(在Android上)只打印出编码为IPv6地址的IPv4地址(127.0.0.1)。即使网络只是IPv4,它也适用于所有套接字。

此处有更多详情:http://www.tcpipguide.com/free/t_IPv6IPv4AddressEmbedding.htm