Android上的IPv6套接字

Ste*_*los 9 java sockets android tcp ipv6

我正在尝试在两个Android设备之间创建IPv6 TCP连接.但是,创建套接字总是失败.

如果我像这样实例化它:

Inet6Address dest = (Inet6Address) InetAddress.getByName(addressString);
Socket socket = new Socket(dest, portNumber);
Run Code Online (Sandbox Code Playgroud)

我得到以下异常:

java.net.ConnectException: failed to connect to *address* (port *portNumber*): connect failed: EINVAL (Invalid argument)
Run Code Online (Sandbox Code Playgroud)

如果我改为实例化我的IPv6Address对象,如下所示:

Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
NetworkInterface wifiInterface = null;
while (networkInterfaces.hasMoreElements()) {
  NetworkInterface networkInterface = networkInterfaces.nextElement();
  if (networkInterface.getDisplayName().equals("wlan0") || networkInterface.getDisplayName().equals("eth0")) {
    wifiInterface = networkInterface;
    break;
  }
}
Inet6Address dest = Inet6Address.getByAddress(null, addressBytes, wifiInterface );
Socket socket = new Socket(dest, portNumber);
Run Code Online (Sandbox Code Playgroud)

我在调用Socket构造函数时遇到此错误:

java.net.ConnectException: failed to connect to *address* (port *portNumber*): connect failed: EADDRNOTAVAIL (Cannot assign requested address)
Run Code Online (Sandbox Code Playgroud)

在带有Jelly Bean的Galaxy Nexus和带有Gingerbread的Nexus One上都会发生这种情况.

难道我做错了什么?创建这样的套接字的正确方法是什么?

另外:这篇文章建议使用构造函数

Inet6Address getByAddress (String host, byte[] addr, int scope_id)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我必须将什么用作scope_id?

sch*_*ver 5

由于您的IP地址是本地链接,因此可能必须使用范围ID或接口创建,以便操作系统知道将其绑定到哪个接口.至于指定scope_id,Android文档似乎有点缺乏.此处的Oracle文档表明范围ID是特定于系统的,无法以编程方式确定.

因此,我会尝试使用备用工厂方法,您可以在其中明确指定要使用的NetworkInterface.详情请见此处.NetworkInterface类中有一些方法可以发现系统上存在哪些接口.