ServerSocket を作成して にバインドするサービスがありますlocalhost:7060
。Android デバイスで「netstat -an」を実行すると、ipv4 localhost インターフェイスではなく、ipV6 localhost が使用されていることがわかります。
出力は次のようになります:
tcp6 0 0 ::ffff:127.0.0.1:7060 :::* LISTEN
ipV4 を使用するポートは次のように一覧表示されます:
tcp 0 0 127.0.0.1:5060 0.0.0.0:* LISTEN
常にIPv4を使用するように強制するトリックは何ですか? iptables を使用してポート転送ルールを設定しています。私が持っているバージョンは、ipv4 宛先アドレスをサポートしています。
これは、ポートでリッスンするための Java コードを作成する方法です。
InetAddress localAddress = Inet4Address.getByName("localhost");
//InetAddress localAddress = Inet4Address.getLocalHost();
sockServer = new ServerSocket(nPort, 20, localAddress);
サービスの起動時にipV4を優先するようにシステムプロパティを設定するなど、他のアドバイスに従いました。それは何の違いもありませんでした。
System.setProperty("java.net.preferIPv4Stack", "true");
組み込みデバイス用に構築された Android 2.3 でこれを実行しています。
更新: Android ツリーで InetAddress.java ソースを確認しました。以下のような行で上記のフラグを読み取っています。
static boolean preferIPv6Addresses() {
String propertyName = "java.net.preferIPv6Addresses";
String propertyValue = AccessController.doPrivileged(new PriviAction<String>(propertyName));
return Boolean.parseBoolean(propertyValue);
}
System.setProperty() 呼び出しが、上記のコードによって読み取られた値を実際に変更しているかどうかはわかりません。