2012-11-16 13 views
9

Próbuję utworzyć połączenie TCP IPv6 między dwoma urządzeniami z Androidem. Jednak tworzenie gniazda zawsze kończy się niepowodzeniem.Gniazdo IPv6 na Androidzie

Gdybym oznacz ją tak:

Inet6Address dest = (Inet6Address) InetAddress.getByName(addressString); 
Socket socket = new Socket(dest, portNumber); 

Otrzymuję następujący wyjątek:

java.net.ConnectException: failed to connect to *address* (port *portNumber*): connect failed: EINVAL (Invalid argument) 

Gdybym zamiast instancję mój adres_IPv6 obiekt tak:

Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces(); 
NetworkInterface wifiInterface = null; 
while (networkInterfaces.hasMoreElements()) { 
    NetworkInterface networkInterface = networkInterfaces.nextElement(); 
    if (networkInterface.getDisplayName().equals("wlan0") || networkInterface.getDisplayName().equals("eth0")) { 
    wifiInterface = networkInterface; 
    break; 
    } 
} 
Inet6Address dest = Inet6Address.getByAddress(null, addressBytes, wifiInterface); 
Socket socket = new Socket(dest, portNumber); 

otrzymuję ten błąd podczas wywoływania konstruktora Socket:

java.net.ConnectException: failed to connect to *address* (port *portNumber*): connect failed: EADDRNOTAVAIL (Cannot assign requested address) 

Zdarza się to zarówno na Galaxy Nexus z Jelly Bean i Nexus One z Gingerbread.

Czy robię coś nie tak? Jaki jest prawidłowy sposób utworzenia takiego gniazda?

również: This post sugeruje użycie konstruktora

Inet6Address getByAddress (String host, byte[] addr, int scope_id) 

Co musiałbym użyć jako scope_id w tym przypadku?

+0

Pokaż nam wartości zmiennych dest i portNumber. –

+0

Wartość adresu addressString w pierwszym wariancie to na przykład "fe80 :: 9221: 55ff: fee3: 3303". Odpowiednia tablica addressBytes to [-2, -128, 0, 0, 0, 0, 0, 0, -110, 33, 85, -1, -2, -29, 51, 3]. Dla portu używam 3109. To ma być losowy port, który nie jest używany do niczego innego. –

+0

Przez przypadek to router, który jest podłączony do obsługi IPv6? –

Odpowiedz

5

Ponieważ Twój adres IP jest linkiem lokalnym, być może MUSI zostać utworzony z identyfikatorem zakresu lub interfejsem, aby system operacyjny wiedział, do jakiego interfejsu go przypisać. Jeśli chodzi o określanie scope_id, dokumenty Android wydają się nieco brakuje. Dokumentacja Oracle here wskazuje, że identyfikator zakresu jest specyficzny dla systemu i nie można go określić programowo.

Tak, chciałbym spróbować użyć alternatywnej metody fabryki, gdzie jawnie określasz interfejs sieciowy, którego chcesz użyć. Szczegóły: here. W klasie NetworkInterface istnieją metody umożliwiające wykrycie istniejących interfejsów w systemie.

+0

Dzięki! Ale czy nie jest to metoda fabryczna zastosowana w drugim wariancie, która rzuca nieco inny wyjątek? –

+0

Masz rację! Przepraszam za to! Jak znalazłeś obiekt NetworkInterface, którego użyłeś w tej próbie? – schtever

+0

Przejmuję przez wszystkie dostępne interfejsy i wybieram tę, której potrzebuję według nazwy, i potwierdziłem, że rzeczywiście otrzymuję właściwy interfejs. Dodałem kod w oryginalnym poście dla jasności. –