2013-01-08 15 views
5

Android 3.2.1(HTC Flyer)でjmdnsを使用しようとしていますが、サービスの検出にjmdnsを使用しています。 3つのデバイスのうちの1つ(残りのデバイスは正常に動作します)がIPv4の代わりにIPv6アドレスをブロードキャストしていることを除いて、すべてうまく動作します。これは、DHCP経由で私のホームネットワークに接続されているため、すべてがIPv4アドレスに割り当てられているので、非常に奇妙です。jmdnsはIPv4インターフェイスに登録しますが、IPv6をブロードキャストします

は、だから私のデバイス上で私は

android.net.wifi.WifiManager wifi = (android.net.wifi.WifiManager) getSystemService(android.content.Context.WIFI_SERVICE); 
    multicastLock = wifi.createMulticastLock("mylockthereturn"); 
    multicastLock.setReferenceCounted(true); 
    multicastLock.acquire(); 
    try { 
     jmdns = JmDNS.create(); 

     jmdns.registerServiceType(jmdnsType); 
     String jmdnsName = /* Read from db */; 
     serviceInfo = ServiceInfo.create(jmdnsType, huggler_id, server.getLocalPort(), " blah blah"); 

     jmdns.registerService(serviceInfo); 
     Log.d(TAG, "JMDNS service registered on ip " + jmdns.getInterface()); 
    } catch (IOException e) { 
     Log.e(TAG, "Error creating JMDNS service (" + e.getMessage() + ")"); 
     e.printStackTrace(); 
    } 

を実行し、それは実際に私のネットワーク(成功)によって割り当てられたものと一致する素敵なIPv4のIPを出力します。

しかし、他のデバイスでサービスを検出するコードを実行すると、

for(ServiceInfo si : jmdns.list(jmdnsType, 6000)) { // timeout: 6s 
     if (si.getName().equals(jmdnsNAme)) 
      continue; 
     try { 
      Log.d(TAG, "Host has " + si.getInet4Addresses().length + " v4 addresses. "); 
      Log.d(TAG, "Host has " + si.getInet6Addresses().length + " v6 addresses. "); 


} 

フライヤーが検出されたときに、正確に1つのv6アドレスが表示されます。

誰かが何が起こったのかもしれませんか?

私はJmdns 3.4.0を使用しています(3.4.1はまったく動作しません!)、私はzeroconf初心者です。

UPDATE:

いくつかの新しい情報:

D/Huggler (5691): Host has 0 v4 addresses. 
    D/Huggler (5691): Host has 1 v6 addresses. 
    D/Huggler (5691): Host IPv6 address is fe80::66a7:69ff:feeb:9083 
    D/Huggler (5691): Host IPv6 hostname is fe80::66a7:69ff:feeb:9083 
    D/Huggler (5691): Host is linklocal true 

誰もがそれらの解釈に役立つことはできますか?

+0

は、そのIPv6アドレスがリンクローカルではありません(すなわち、FE80 ::何か)? – fge

+0

また、JVM引数を制御できる場合は、 '-Djava.net.preferIPv4Stack = true'を追加しようとしましたか?はいの場合は、まだこのバグはありますか? – fge

+0

コメントをいただきありがとうございます。最初のコメント:それを拡大できますか? (私が正しく理解していれば、それは127.0.0.1のIPv6に相当すると言われていますか? 第2コメント:アンドロイド用にコンパイルするときにこの設定をどうやって設定しますか?私はできません – siemanko

答えて

8

同じ問題が発生しましたが、jmDNS.createの呼び出しでInetAddressを渡すと、このトリックが実行されたようです。

だから、のようなものを試してください:

WifiManager wifi = (WifiManager)getActivity().getSystemService(android.content.Context.WIFI_SERVICE); 
String ip = Formatter.formatIpAddress(wifi.getConnectionInfo().getIpAddress()); 
jmdns = JmDNS.create(InetAddress.getByName(ip)); 
関連する問題