Привязка сокета сервера IPv6 в Windows - PullRequest
5 голосов
/ 31 августа 2009

Я пытаюсь привязать сокет сервера 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.

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

Ответы [ 4 ]

7 голосов
/ 01 сентября 2009

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

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

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

1 голос
/ 01 сентября 2009

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

0 голосов
/ 01 марта 2011

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

http://bugs.jython.org/issue1711

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

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

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

0 голосов
/ 01 марта 2011

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

http://bugs.jython.org/issue1711

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

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

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

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

...