Вопрос

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

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

К сожалению, это не удается из-за исключения IOException:Семейство адресов не поддерживается семейством протоколов:связывать

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

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

Что я делаю не так?

Это было полезно?

Решение

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

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

Редактировать:это означает, что NIO нельзя использовать с IPv6.

Другие советы

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

Я также вижу эту проблему с 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

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

http://bugs.jython.org/issue1711

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top