2011-11-29 9 views
11

私はServerSocketを作成し、localhost:7060にバインドするサービスを持っています。私がアンドロイドデバイスで "netstat -an"を実行したとき、ipv4 localhostインターフェイスの代わりにipV6 localhostを使用していることがわかりました。私のサービスは、常にipv4ではなくipv6 localhostにバインドされますか?

出力はこのようなものです:
にtcp6 0 0 :: FFFF:127.0.0.1:
TCP 0:7060 ::: * LISTENはIPv4を使用

ポートは、次のように記載されています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でこれを実行しています。

更新: アンドロイドツリーでInetAddress.javaソースをチェックしました。上記のフラグは、次のような行で読み取っています。

static boolean preferIPv6Addresses() { 
     String propertyName = "java.net.preferIPv6Addresses"; 
     String propertyValue = AccessController.doPrivileged(new PriviAction<String>(propertyName)); 
     return Boolean.parseBoolean(propertyValue); 
    } 

今私はするSystem.setProperty()呼び出しは、実際に上記のコードで読み取り値を変更していることを確認していません。

+0

私はこれらのシステムのプロパティはOS自体にあり、それらをプログラム的に変更することはできません(すべてのアプリケーションが同じシステムプロパティに依存するため)。 –

+2

(この古いスレッドは別の場所で参照されていたので、いくつかの説明が必要です) ':: 1'はIPv6のローカルホストアドレスです。 ':: ffff:127.0.0.1'はそうではありません、それはIPv6表記法(いわゆるIPv4マップされたIPv6アドレス)のIPv4ローカルホストアドレスです。これは、IPv4パケットとIPv6パケットの両方を受け入れることができるデュアルスタックソケットに使用されます。 (ソケットに 'tcp46'というラベルを付ける必要がありますが)。 – Dubu

答えて

2

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

"localhost"の代わりに "127.0.0.1"を使用すると、IPv4アドレスとIPv6アドレスが関連付けられます。

関連する問題