Je ne connais aucun moyen de savoir quel serveur de noms a renvoyé le résultat juste en regardant les résultats d'un appel à res_search()
. Cette information est uniquement dans l'en-tête de paquet UDP de niveau supérieur et n'est plus disponible au moment où le paquet a été déballé par libresolv
.
Cependant, selon la version de libresolv
il semble être possible de le faire en vous inscrivant un « crochet de réponse » avec le résolveur en utilisant:
res_send_setrhook()
ou
_res.rhook = &funcptr;
Le premier paramètre fourni au rappel de crochet sera un struct sockaddr *
du serveur qui a envoyé la réponse. Le code ci-dessous fonctionne sur Mac OS 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(...);
}
BTW est (la plupart du temps) peut demander à un serveur ce qu'il pense son appelé:
dig @server hostname.bind ch txt
qui renvoie un enregistrement contenant le TXT
nom d'hôte du serveur (tant que la fonctionnalité existe dans le logiciel serveur DNS et n'a pas été désactivée). Ceci peut être utile pour identifier le serveur hors de tout "DNS Anycast Cloud" particulier qui vous sert actuellement.
Le titre me semble étrange! – dirkgently
Je suppose que le PO pense que c'est son titre, plutôt que le titre de la publication. Ça vaut le coup, je pense ... –
J'ai voté pour la fermeture: "appartient sur serverfault.com". –