Невозможно привязать к адресу IPv6 - PullRequest
2 голосов
/ 27 марта 2010

У меня странная проблема в моей системе Ubuntu Karmic.

Когда я вызываю getaddrinfo () с AI_PASSIVE и AF_UNSPEC, для пустого хоста и порта UDP 12000, чтобы получить привязываемый адрес, я получаю только один результат IPv4 ( 0.0.0.0: 12000 , например, ).

Если я изменю свой вызов и укажу AF_INET6 вместо AF_UNSPEC, то getaddrinfo () вернет «Имя или служба неизвестна».

Разве я не должен получить [::]: 12000 в результате?

То же самое происходит, если я установил хост на :: 1 .

Когда я вызываю getaddrinfo () без AI_PASSIVE (чтобы получить «подключаемый» адрес) для хоста «localhost» и порта UDP 12000, я сначала получаю [:: 1]: 12000 затем 127.0.0.1:. 12000

Так что, очевидно, моя система готова к IPv6 (я могу пропинговать как адреса IPv4, так и адреса IPv6, а также разрешение DNS). Но как получается, что я не могу получить IPv6-адрес для привязки с помощью getaddrinfo ()?

Ребята, вы понимаете, что может быть не так?

Моя ОС - Ubuntu Karmic, новая установка без каких-либо настроек сети.

Спасибо.

P.S .: Если вы понятия не имеете, но все же хотите помочь мне, вы можете получить образец программы или введите:

wget http://people.apache.org/~jorton/gai.c

И дайте мне результат:

$ ./gai -ap null 12000

Мой результат:

$ ./gai -ap null 12000

getaddrinfo (NULL, "12000", {.family = AF_UNSPEC, .hints = 0 | AI_ADDRCONFIG | AI_PASSIVE}) = 0:

family = 2, proto = 6 inet4: addr = 0.0.0.0, port = 12000

Там видно, что у меня только один результат IPv4.

1 Ответ

2 голосов
/ 27 марта 2010

Это происходит в новых системах, использующих eglibc: debian-glibc .

Очевидно, есть ошибка, которая требует от вас установить хотя бы один действительный адрес IPv6 для одного из ваших сетевых интерфейсов (петля не учитывается).

После того, как я это сделал:

$ sudo ip -6 addr 2001: 660: 4701: 1001 :: 1 dev eth0

У меня есть:

$ ./gai -ap null 12000

getaddrinfo (NULL, "12000", {.family = AF_UNSPEC, .hints = 0 | AI_ADDRCONFIG | AI_PASSIVE}) = 0:

family = 2, proto = 6 inet4: addr = 0.0.0.0, port = 12000

family = 10, proto = 6 inet6: addr = ::, port = 12000, flowinfo = 0

Надеюсь, это кому-нибудь поможет.

...