Привязка сокета сервера IPv6 в Windows

Я пытаюсь связать сокет сервера IPv6 в Java 1.6 в Windows 7, используя этот фрагмент:

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

К сожалению, это не удается с ошибкой IOException: семейство адресов не поддерживается семейством протоколов: bind

Я понимаю, что Java написана с предположением, что Windows использует отдельные стеки v4 и v6 (даже если Windows 7 этого не делает), и поэтому привязка одного сокета как для v4, так и для v6 не может работать. Однако это не то, что я пытаюсь сделать: я просто хочу привязать сокет v6 к любому адресу (т.е. ::).

Редактировать: он также не работает в Vista.

Что я делаю неправильно?


person Martin v. Löwis    schedule 31.08.2009    source источник


Ответы (4)


Я нашел решение; это ошибка 6230761. Единственный поддерживаемый способ создания канала сокета сервера IPv6 — сначала создать серверный сокет:

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

Изменить: это означает, что NIO нельзя использовать с IPv6.

person Martin v. Löwis    schedule 01.09.2009
comment
Если я правильно понимаю ОЦЕНКУ в связанном отчете об ошибке, это уже должно быть исправлено в Java 7 b36+. Правильно ли я понимаю? - person wilx; 23.04.2014

Эта ошибка означает, что вы смешиваете адрес IPv6 с протоколом, отличным от IPv6. Вероятно, это означает, что ServerSocketChannel, с которого вы начинаете, не поддерживает IPv6. Я не думаю, что Java официально поддерживает Windows 7. Попробуйте использовать NetworkInterface.getNetworkInterfaces() и NetworkInterface.getInetAddresses(), чтобы убедиться, что адреса IPv6 действительно доступны для вашего Java-приложения. В документации по Java даже говорится, что попытка передать адрес IPv6, когда IPv6 недоступен или когда IPv6 отключен, приведет к возникновению исключений.

person Remy Lebeau    schedule 01.09.2009
comment
Я посмотрел на getInetAddresses, и он действительно распознает адреса IPv6. Итак, как мне получить ServerSocketChannel, поддерживающий IPv6? - person Martin v. Löwis; 01.09.2009

Я также вижу эту проблему с jython.

http://bugs.jython.org/issue1711

Модуль сокета jython должен использовать java.nio, потому что это единственный способ поддерживать неблокирующую функциональность, которая требуется для совместимости с cpython.

Я очень разочарован, увидев, что IPV6 не поддерживается последней версией Java, работающей в последних версиях Windows: это очень плохо. Адресное пространство IPV4 уже исчерпано: в ближайшие месяцы, не говоря уже о годах, спрос на поддержку IPV6 будет намного выше.

У нас есть обходной путь для пользователей jython, который заставляет функцию getaddrinfo() возвращать только адреса IPV4. Это плохой обходной путь, но, по крайней мере, он заставляет пользователей работать, если они могут получить адрес IPV4.

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

person Alan Kennedy    schedule 28.02.2011

Только что был еще один отчет от репортера об этой ошибке на трекере jython. Он говорит, что успешно использовал сокеты java.nio с IPV6 в раннем выпуске JDK 1.7.

http://bugs.jython.org/issue1711

Так что мой пост о поддержке IPV6 на jython не был преждевременным :-)

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

Хммм, кажется, мой второй ответ был указан выше моего первого ответа. Смотрите мой первый ответ ниже для контекста.

person Alan Kennedy    schedule 28.02.2011