Я пишу или изменяю программы, которые выполняют разрешение имен, и нуждаются в правильном управлении процессом, . Поэтому я не использую 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. Кажется, есть несколько программ, которые его используют.
Но недокументированные :-( Сусанна: ~% uname -r 7,0-RELEASE Сусанна: ~% человек res_setservers Нет ручного ввода для res_setservers – bortzmeyer
Я не нахожу 'res_setservers' на Linux/GLibC машинах я. предположим, что нет стандарта для разрешения IPv6 :-( – bortzmeyer
odd - он находится в файле resolv.h :(. Символ существует в Mac OS X, хотя он действительно res_9_setservers, а #define предоставляет доступ к нормальной версии. – Alnitak