0

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

4

2 回答 2

0

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

更多细节在这里:http ://www.tcpipguide.com/free/t_IPv6IPv4AddressEmbedding.htm

于 2014-08-11T05:18:30.127 回答
0

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

于 2013-08-25T19:56:52.883 回答