【问题标题】:Why a socket server on android always listen on IPv6?为什么 android 上的套接字服务器总是监听 IPv6?
【发布时间】:2013-07-23 08:27:53
【问题描述】:

我启动了一个服务器套接字,并希望它监听环回地址(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地址?

【问题讨论】:

标签: android sockets ipv6 ipv4


【解决方案1】:

它没有将 IPv4 地址映射到 IPv6。 Inet4AddressInet6Address 没有实现 getByName() 方法,所以您实际上使用的是从 InetAddress 继承的方法。如果 IPv4 和 IPv6 都可以访问主机,则大多数操作系统会更喜欢 IPv6 而不是 IPv4(您也应该这样做:))。您可以尝试通过InetAddress.getAllByName("localhost") 获取地址数组,然后检查地址是否为Inet4Address 的实例(或Inet6Address 在其他情况下),但此示例最简单的解决方案是硬编码环回地址(127.0.0.1)因为它几乎没有改变的机会。

【讨论】:

    【解决方案2】:

    它本身并不是在侦听 IPv6,netstat(在 Android 上)只是打印出编码为 IPv6 地址的 IPv4 地址(127.0.0.1)。即使网络仅为 IPv4,它也会对所有套接字执行此操作。

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

    【讨论】:

      猜你喜欢
      • 2017-05-01
      • 1970-01-01
      • 2018-05-27
      • 1970-01-01
      • 1970-01-01
      • 2017-11-24
      • 2011-11-21
      • 2016-11-06
      • 1970-01-01
      相关资源
      最近更新 更多