Я не знаю, как узнать, какой сервер имён вернул результат, просто посмотрев на результаты вызова res_search()
. Эта информация находится только в заголовке UDP-пакета более высокого уровня и больше не доступна к моменту, когда пакет был распакован libresolv
.
Однако, в зависимости от версии libresolv
, кажется, что это возможно сделать, зарегистрировав "ловушку ответа" с распознавателем, используя:
res_send_setrhook()
или
_res.rhook = &funcptr;
Первым параметром, предоставленным для обратного вызова ловушки, будет struct sockaddr *
сервера, отправившего ответ. Код ниже работает на MacOS X 10.5.6:
#include <stdlib.h>
#include <stdio.h>
#include <resolv.h>
#include <netinet/in.h>
res_sendhookact hook(const struct sockaddr *ns,
const u_char *query,
int querylen,
u_char *ans,
int anssiz,
int *resplen)
{
fprintf(stderr, "answer returned from %s\n",
inet_ntoa(((struct sockaddr_in *)ns)->sin_addr));
return res_goahead;
}
main() {
res_init();
_res.rhook = hook;
res_search(...);
}
Кстати, (в основном) можно спросить сервер, как он считает, что он называется:
dig @server hostname.bind ch txt
, который вернет запись TXT
, содержащую имя хоста сервера (при условии, что эта функциональность существует в программном обеспечении сервера DNS и не отключена).
Это может быть полезно для определения того, какой сервер из какого-либо конкретного «DNS Anycast Cloud» обслуживает вас в данный момент.