Использование преобразователя имен resolv.h с IPv6 - PullRequest
3 голосов
/ 23 декабря 2008

Я пишу или изменяю программы, которые выполняют разрешение имен и нуждаются в хороший контроль над процессом. Поэтому я не пользуюсь getaddrinfo(), хожу глубже и используйте res_query() / res_send() / etc в resolv.h, задокументировано в резольвере (3).

Хотя это и не задокументировано, общий способ установки используемого резольвера заключается в обновление _res.nsaddr_list. Но этот массив, определенный в resolv.h, хранит struct sockaddr_in, то есть только адреса IPv4. (Адреса IPv6 равны struct sockaddr_in6, независимая от семьи система будет использовать struct sockaddr.)

Я ищу способ (желательно портативный, по крайней мере, среди различный Unix), чтобы сказать _res, что я хочу также адреса IPv6.

По-видимому, давным-давно во FreeBSD была _res_ext с этим способность, но я больше не могу найти ее в недавнем FreeBSD 7 (grep _res_ext /usr/include/resolv.h ничего не находит). Вы все еще можете найти код, который его использует (попробуйте с Google Codesearch ).

Благодаря Alnitak я заметил, что сейчас, по-видимому, _res._ext, а не .res_ext. Интересно, где такие вещи задокументированы или объявлены ... Я понятия не имею, насколько портативен _res._ext. Я могу найти это на Debian и FreeBSD. Кажется, есть несколько программ, которые его используют.

Ответы [ 2 ]

2 голосов
/ 23 декабря 2008

Stéphane - если ваш resolv.h не включает поддержку sockaddr_in6, то это говорит о том, что на вашем конкретном O / S распознаватель сам не поддерживает транспорт IPv6.

Я проверил некоторые из моих систем здесь:

  • MacOS X 10.5.6 - поддерживает библиотеку BIND 9, которая имеет функцию res_setservers(), которая может принимать адреса IPv6, без расширения _res._ext.

  • CentOS 5.2 - имеет расширение _res._ext, хотя в справочной странице для resolv.conf нет упоминания об IPv6, за исключением того, что есть параметр, указывающий решателю возвращать записи AAAA, прежде чем искать записи A для gethostbyname().

EDIT - также хранилище CVS для FreeBSD предполагает, что FreeBSD 7.0 (см. Тег FREEBSD_7_0_0_RELEASE) также поддерживает res_setservers() из Bind 9.

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

Glibc:

res_setservers: no
__res_state._u._ext.nsaddrs
__res_state._u._ext.nsmap

установите последнее значение MAXNS + 1 в соответствии с:

http://sourceware.org/ml/libc-hacker/2002-05/msg00035.html

BSD-Libc:

res_setservers: yes
__res_state._u._ext.__res_state_ext

Мне это кажется грязным, и вам, вероятно, понадобится автоконф.

...