2009-08-31 13 views
5

próbuję powiązać gniazda serwera IPv6 w Javie 1.6 w systemie Windows 7, za pomocą tego fragmentu:Oprawa gniazdo serwera IPv6 w systemie Windows

ssock = ServerSocketChannel.open(); 
ServerSocket sock = ssock.socket(); 
sock.bind(new InetSocketAddress(InetAddress.getByAddress(new byte[16]), 0)); 

Niestety, to się nie powiedzie z IOException: rodzina adresów nie obsługiwane przez protokół rodzina: bind

Rozumiem, że Java została napisana przy założeniu, że Windows używa oddzielnych stosów v4 i v6 (nawet jeśli Windows 7 nie ma) i że w związku z tym wiązanie pojedynczego gniazda dla wersji v4 i v6 nie działa. Jednak to nie jest to, co próbuję zrobić: Po prostu chcę powiązać gniazdo V6 z adresem dowolnym adresem (tj. :).

Edytuj: Nie działa również w systemie Vista.

Co robię źle?

Odpowiedz

7

Znalazłem rozwiązanie; to jest bug 6230761. Jedynym sposobem, aby wspierać tworzenie kanału gniazda serwera IPv6 jest stworzenie ServerSocket pierwszy:

ServerSocket s = new ServerSocket(); 
s.bind(new InetSocketAddress(InetAddress.getByName("::"), 0)); 

Edit: oznacza to, że NIO naprawdę nie można stosować z IPv6.

+0

Jeśli dobrze rozumiem "OCENĘ" w połączonym raporcie o błędach, powinno to już być naprawione w Javie 7 b36 +. Czy moje zrozumienie jest poprawne? – wilx

1

Błąd ten oznacza, że ​​mieszany jest adres IPv6 z protokołem innym niż IPv6. To prawdopodobnie oznacza, że ​​ServerSocketChannel, od którego zaczynasz, nie obsługuje IPv6. Nie sądzę, że Java oficjalnie obsługuje jeszcze Windows 7. Spróbuj użyć NetworkInterface.getNetworkInterfaces() i NetworkInterface.getInetAddresses(), aby upewnić się, że adresy IPv6 są faktycznie dostępne dla twojej aplikacji Java. Dokumenty Java nawet mówią, że próba przekazania adresu IPv6, gdy IPv6 nie jest dostępny, lub gdy IPv6 został wyłączony, spowoduje wyjątki.

+0

Spojrzałem na getInetAddresses i rzeczywiście rozpoznaje adresy IPv6. Jak więc uzyskać ServerSocketChannel, który obsługuje IPv6? –

0

Widzę ten problem również z jythonem. Moduł Gniazdo

http://bugs.jython.org/issue1711

jython musi używać java.nio, ponieważ jest to jedyny sposób, aby wspierać nieblokującą funkcjonalność CPython kompatybilność wymaga.

Jestem niezmiernie rozczarowany widząc, że IPV6 nie jest wspierany przez najnowszą wersję java działającą w najnowszych oknach: jest to bardzo słabe. Przestrzeń adresowa IPV4 jest już wyczerpana: w nadchodzących miesiącach będzie znacznie więcej zapotrzebowania na obsługę IPV6, nie mówiąc już o latach.

Mamy obejście dla użytkowników jython, które zmusza funkcję getaddrinfo() do zwracania tylko adresów IPV4. To kiepskie rozwiązanie, ale przynajmniej uruchamia ono użytkowników, jeśli mogą uzyskać adres IPV4.

http://wiki.python.org/jython/NewSocketModule#IPV6_address_support

0

tam właśnie kolejny raport z reporterem tego błędu na trackerze jython. Mówi, że odniósł sukces przy użyciu gniazd java.nio z IPV6 we wczesnej wersji JDK 1.7.

http://bugs.jython.org/issue1711

Więc moim blogu o wsparcie IPv6 w Jython nie była przedwczesna :-)

http://jython.xhaus.com/jython-supports-ipv6/

Hmmm, wydaje się, że moja druga odpowiedź została wymieniona powyżej mojej pierwszej odpowiedzi. Zobacz dla mojej pierwszej odpowiedzi poniżej dla kontekstu.

Powiązane problemy