10

2 つの Android デバイス間で IPv6 TCP 接続を作成しようとしています。ただし、ソケットの作成は常に失敗します。

次のようにインスタンス化すると:

Inet6Address dest = (Inet6Address) InetAddress.getByName(addressString);
Socket socket = new Socket(dest, portNumber);

次の例外が発生します。

java.net.ConnectException: failed to connect to *address* (port *portNumber*): connect failed: EINVAL (Invalid argument)

代わりに、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);

Socket コンストラクターを呼び出すと、次のエラーが発生します。

java.net.ConnectException: failed to connect to *address* (port *portNumber*): connect failed: EADDRNOTAVAIL (Cannot assign requested address)

これは、Jelly Bean を搭載した Galaxy Nexus と Gingerbread を搭載した Nexus One の両方で発生します。

私は何か間違ったことをしていますか?そのようなソケットを作成する正しい方法は何ですか?

また:この投稿では、コンストラクターの使用を提案しています

Inet6Address getByAddress (String host, byte[] addr, int scope_id)

この場合、scope_id として何を使用する必要がありますか?

4

1 に答える 1

5

IP アドレスはリンク ローカルであるため、OS がバインド先のインターフェイスを認識できるように、スコープ ID またはインターフェイスを使用して IP アドレスを作成する必要があります。scope_id の指定に関しては、Android のドキュメントがやや不足しているようです。ここのOracleドキュメントは、スコープIDがシステム固有であり、プログラムで決定できないことを示しています。

したがって、使用する NetworkInterface を明示的に指定する別のファクトリ メソッドを使用してみます。詳しくはこちらをご覧ください。NetworkInterface クラスには、システムに存在するインターフェイスを検出するためのメソッドがあります。

于 2012-11-20T16:50:22.277 に答える