J'écris une application qui me demande de faire une recherche DNS pour un enregistrement MX. Je ne sais pas si quelqu'un a eu de l'expérience faisant ce genre de travail, mais si vous le faites, toute aide serait appréciée. P>
EDIT: La chose que je vais pour est une application qui enverra une alerte e-mail. Le problème est que je dois que l'application soit en mesure de rechercher l'enregistrement MX pour un domaine. P>
5 Réponses :
La méthode la plus simple consiste simplement à utiliser des outils couramment disponibles.
La commande de base "dig" vous ramène les enregistrements à vous via cette requête: p> si vous Vous voulez juste les lignes avec les enregistrements MX ... P> #include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <resolv.h>
int main (int argc, char *argv[])
{
u_char nsbuf[4096];
char dispbuf[4096];
ns_msg msg;
ns_rr rr;
int i, j, l;
if (argc < 2) {
printf ("Usage: %s <domain>[...]\n", argv[0]);
exit (1);
}
for (i = 1; i < argc; i++) {
l = res_query (argv[i], ns_c_any, ns_t_mx, nsbuf, sizeof (nsbuf));
if (l < 0) {
perror (argv[i]);
} else {
#ifdef USE_PQUERY
/* this will give lots of detailed info on the request and reply */
res_pquery (&_res, nsbuf, l, stdout);
#else
/* just grab the MX answer info */
ns_initparse (nsbuf, l, &msg);
printf ("%s :\n", argv[i]);
l = ns_msg_count (msg, ns_s_an);
for (j = 0; j < l; j++) {
ns_parserr (&msg, ns_s_an, j, &rr);
ns_sprintrr (&msg, &rr, NULL, NULL, dispbuf, sizeof (dispbuf));
printf ("%s\n", dispbuf);
}
#endif
}
}
exit (0);
}
Désolé pour la confusion, j'essaie de trouver le code qui serait utilisé pour creuser pour trouver l'enregistrement MX. Je sais que Crig et Nslookup existent, mon truc est que je souhaite écrire une application qui fera ces recherches sans une application externe.
Vous pouvez télécharger le code source pour cela ici: isc.org/downloadables/11
Merci, je vérifie le code que vous avez posté il y a un peu, semble relativement proche et plus important encore, la page de résolveur (3) Man semble assez utile.
J'ai retourné à la réponse qui incluait le code depuis votre pensée que c'était utile.
Je sais que c'est tard :-), mais j'ai eu l'occasion de heurter cette question en 2021. Vous voudrez peut-être remplacer Res_Query avec res_Search. Ce dernier élargira les noms de noms aux chemins énumérés dans l'entrée "Recherche" dans resolv.conf.
Je remarque que vous écrivez pour Linux. La manière idomique pour un programme régulier d'envoyer du courrier sur des systèmes de type UNIX est soit: p>
Les deux manières présumées que le courrier local est configuré pour passer du courrier à l'endroit où il doit aller; Sur une boîte Linux bien configurée, il s'agit d'une hypothèse fidèle. P>
Si cela ne fait pas appel, la deuxième meilleure façon est que votre programme accepte l'adresse d'un serveur de relais de messagerie local à utiliser et de vous connecter à ce serveur sur le port 25. P>
En d'autres termes, dans la mesure du possible, utilisez un relais de messagerie existant pour envoyer votre courrier. Ces relais de messagerie auront toutes les connaissances locales qui pourraient être nécessaires pour obtenir le courrier du réseau que vous utilisez - il suffit de regarder le MX et d'essayer d'envoyer directement à la destination ne va pas toujours fonctionner. P >
Si vous avez lu tout cela et que vous toujours em> veuillez rechercher des enregistrements MX, essayez le Library d'ADNS , il prend soin de tous les détails fastidieux impliqués dans la résolution DNS (et crois-moi, il est em> fastidieux et facile de se tromper!). P>
[Disclaimer: J'étais un testeur bêta heureux des trucs de Snertsoft et j'exécute toujours plusieurs de leurs produits] P>
faire en fait cela à la main a ses pièges, par ex. Lorsque vous devez gérer une réponse tronquée et devez passer de UDP en TCP. P>
SNERTSOFT 'S Devez-vous bien réimplément un MTA au lieu d'utiliser une solution existante? P> libsnert code> (gratuit, licence de clic requis) a déjà une implémentation C pour cela renvoyant un vecteur d'entrées. Essayez d'éviter "non-inventé - ici" si possible :) p>
Jetez un coup d'œil à LDNS , de NlNet Labs. Cette bibliothèque gère la manutention de paquets de faible niveau et possède son propre client de résolution intégré. P>
La documentation inclut exemple de code qui fait exactement ce dont vous avez besoin . p>
sur Linux:
Quelle est votre question actuelle? C'est un peu diffusé pour le moment. De plus, si vous avez du code en rapport avec le problème, veuillez le fournir.
Oui, désolé pour ça; Je n'ai pas de code disponible pour le moment car j'essaie de comprendre comment écrire le code. Fondamentalement, j'essaie d'écrire une application pour trouver l'enregistrement MX.
Aucun problème. Cela pourrait vous aider. Outils.ietf.org/html/RFC1035
Merci pour le lien, je sais que je pouvais faire quelque chose comme faire un drogram envoyer puis écouter sur DGRAM pour la réponse, mais ce serait une douleur comme je aurais besoin de connaître le port source à écouter, mais semble que ce soit Le meilleur choix si le résolveur (3) ne panne pas.
53 est par défaut pour DNS. Cela pourrait être un autre, mais cela fonctionnera pour les serveurs DNS racine.
Merci @great Turtle! Pour étendre sa réponse, ce code doit être compilé avec le drapeau "-LResolv"