2008-12-23 11 views
3

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

Хотя не документировано, общий способ установки используемого преобразователя - обновление _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 ничего не находит). Вы все еще можете найти code which uses it (попробуйте сами with Google Codesearch).

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

ответ

2

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

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

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

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

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

+0

Но недокументированные :-( Сусанна: ~% uname -r 7,0-RELEASE Сусанна: ~% человек res_setservers Нет ручного ввода для res_setservers – bortzmeyer

+0

Я не нахожу 'res_setservers' на Linux/GLibC машинах я. предположим, что нет стандарта для разрешения IPv6 :-( – bortzmeyer

+0

odd - он находится в файле resolv.h :(. Символ существует в Mac OS X, хотя он действительно res_9_setservers, а #define предоставляет доступ к нормальной версии. – Alnitak

1

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 

Кажется неаккуратно мне и вам, вероятно, потребуется Autoconf.