2013-01-08 24 views
5

. Próbuję użyć jmdns na Androidzie 3.2.1 (HTC Flyer) i używam jmdns do wykrywania usług. Wszystko działa dobrze, z tym że jedno z moich trzech urządzeń (reszta z nich działa dobrze) nadaje adres IPv6 zamiast IPv4. To bardzo dziwne, ponieważ wszystkie są połączone z moją siecią domową przez DHCP, więc wszystkie mają przypisany adres IPv4.jmdns rejestruje się na interfejsie IPv4, ale nadaje IPv6

Więc w moim urządzeniu biegnę

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(); 
    } 

I wypisuje ładny IPv4 IP, które rzeczywiście pasuje do jednego przypisanego przez moją sieć (sukces).

Ale po uruchomieniu kodu, który wykrywa usługi na innych urządzeniach.

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. "); 


} 

A kiedy odkryje ulotkę, wyświetli dokładnie jeden adres v6.

Czy ktoś może zasugerować, co mogło się stać?

Używam Jmdns 3.4.0 (3.4.1 nie działa w ogóle!) I jestem rodzaju początkujący zerokonf.

UPDATE:

Niektóre nowe informacje:

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 

Czy ktoś może pomóc zinterpretować te?

+0

nie miałoby to być adres IPv6 link-local (tj FE80 :: coś)? – fge

+0

Ponadto, jeśli możesz kontrolować argumenty maszyny JVM, czy próbowałeś dodać '-Djava.net.preferIPv4Stack = true'? Jeśli tak, czy nadal masz ten błąd? – fge

+0

Dzięki za komentarz, fge. Pierwszy komentarz: czy możesz to rozwinąć? (Jeśli zrozumiałem cię poprawnie, czy mówisz, że jest to odpowiednik adresu IPv6 w wersji 127.0.0.1? Jak to by to wyjaśniło pierwszą część mojego pytania) Drugi komentarz: Jak ustawić te ustawienia podczas kompilacji dla Androida? Myślę, że nie mogę – siemanko

Odpowiedz

8

Wystąpił ten sam problem, ale przekazanie adresu InetAdress w wywołaniu jmDNS.create sprawiało wrażenie problemu.

Więc spróbuj coś takiego:

WifiManager wifi = (WifiManager)getActivity().getSystemService(android.content.Context.WIFI_SERVICE); 
String ip = Formatter.formatIpAddress(wifi.getConnectionInfo().getIpAddress()); 
jmdns = JmDNS.create(InetAddress.getByName(ip)); 
Powiązane problemy