为什么android上的套接字服务器总是监听IPv6?
我启动了一个服务器套接字,希望它监听环回地址(127.0.0.1)。代码如下:为什么android上的套接字服务器总是监听IPv6?,android,sockets,ipv6,ipv4,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
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() + ".");
}
}
......
}
但是我发现这个套接字开始监听一个IPv6地址:ffff:127.0.0.1,并使用命令“netstat”,然后
导致在另一个进程(Python)中运行的客户端无法通过“127.0.0.1”连接到此服务器
为什么android会自动将IPV4地址映射到IPv6地址?它没有将IPV4地址映射到IPv6
Inet4Address
和Inet6Address
没有实现getByName()
方法,因此您实际上使用的是从InetAddress
继承的方法。如果主机可以通过IPv4和IPv6访问,大多数操作系统都会选择IPv6而不是IPv4(您也应该如此:)。您可以尝试通过InetAddress.getAllByName(“localhost”)
获取地址数组,然后检查地址是否为Inet4Address
(或者在其他情况下为Inet6Address
)的实例,但本例最简单的解决方案是硬编码环回地址(127.0.0.1)因为它实际上没有改变的机会。它本身并没有监听IPv6,netstat(Android上)只是打印出编码为IPv6地址的IPv4地址(127.0.0.1)。即使网络仅为IPv4,它也会对所有套接字执行此操作
更多详细信息:您在Android上运行Python的具体情况如何?可能与