Невозможно привязать к IPv6-адресу

Я столкнулся со странной проблемой в моей системе 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, свежая установка без каких-либо настроек сети.

Спасибо.

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

wget http://people.apache.org/%7Ejorton/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.


person ereOn    schedule 27.03.2010    source источник


Ответы (1)


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

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

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

$ sudo ip -6 addr add 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

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

person ereOn    schedule 27.03.2010