Я пишу или изменяю программы, которые выполняют разрешение имен и нуждаются в
хороший контроль над процессом. Поэтому я не пользуюсь 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. Кажется, есть несколько программ, которые его используют.