11

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() 呼び出しが、上記のコードによって読み取られた値を実際に変更しているかどうかはわかりません。

4

1 に答える 1

2

理論的には、IPv6 サーバーは IPv4 もリッスンします。IPv4 アドレス空間は IPv6 のサブセットであるため、これが実際の問題を引き起こしていますか?

IPv4 アドレスと IPv6 アドレスが関連付けられている「localhost」の代わりに「127.0.0.1」を使用するとうまくいくかもしれません。

于 2013-05-10T01:43:06.057 に答える