简体   繁体   English

如何查询服务器并获取 MX、A、NS 记录

[英]How to query a server and get the MX, A, NS records

I'm trying to get the A, MX and NS A server record as follows:我正在尝试获取 A、MX 和 NSA 服务器记录,如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <resolv.h>
#include <netdb.h>

#define N 4096

int main (int argc, char *argv[])
{
    u_char nsbuf[N];
    char dispbuf[N];
    ns_msg msg;
    ns_rr rr;
    int i, l;

    if (argc < 2) {
        printf ("Usage: %s <domain>\n", argv[0]);
        exit (1);
    }

    // HEADER
    printf("Domain : %s\n", argv[1]);
    // ------

    // A RECORD
    printf("A records : \n");
    l = res_query(argv[1], ns_c_any, ns_t_a, nsbuf, sizeof(nsbuf));
    if (l < 0)
    {
      perror(argv[1]);
    }
    ns_initparse(nsbuf, l, &msg);
    l = ns_msg_count(msg, ns_s_an);
    for (i = 0; i < l; i++)
    {
      ns_parserr(&msg, ns_s_an, 0, &rr);
      ns_sprintrr(&msg, &rr, NULL, NULL, dispbuf, sizeof(dispbuf));
      printf("\t%s \n", dispbuf);
    }
    //------------


    // MX RECORD
    printf("MX records : \n");
    l = res_query(argv[1], ns_c_any, ns_t_mx, nsbuf, sizeof(nsbuf));
    if (l < 0)
    {
      perror(argv[1]);
    }
    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);
      l = ns_msg_count(msg, ns_s_an);
      for (i = 0; i < l; i++)
      {
        ns_parserr(&msg, ns_s_an, i, &rr);
        ns_sprintrr(&msg, &rr, NULL, NULL, dispbuf, sizeof(dispbuf));
        printf ("\t%s\n", dispbuf);
      }
#endif
    }
    // ---------

    // NS RECORD
    printf("NS records : \n");
    l = res_query(argv[1], ns_c_any, ns_t_ns, nsbuf, sizeof(nsbuf));
    if (l < 0)
    {
      perror(argv[1]);
    }
    ns_initparse(nsbuf, l, &msg);
    l = ns_msg_count(msg, ns_s_an);
    for (i = 0; i < l; i++)
    {
      ns_parserr(&msg, ns_s_an, 0, &rr);
      ns_sprintrr(&msg, &rr, NULL, NULL, dispbuf, sizeof(dispbuf));
      printf("\t%s \n", dispbuf);
    }
    // ---------
    return 0;
}

On request receive a lot of the same, that is, the same A records.根据请求收到很多相同的,即相同的 A 记录。 The same with the NS records.与 NS 记录相同。 What am I doing wrong?我究竟做错了什么? Example:例子:

Domain : mail.ru
A records :
        mail.ru.                22S IN A        94.100.191.207
        mail.ru.                22S IN A        94.100.191.207
        mail.ru.                22S IN A        94.100.191.207
        mail.ru.                22S IN A        94.100.191.207
        mail.ru.                22S IN A        94.100.191.207
        mail.ru.                22S IN A        94.100.191.207
        mail.ru.                22S IN A        94.100.191.207
        mail.ru.                22S IN A        94.100.191.207
        mail.ru.                22S IN A        94.100.191.207
        mail.ru.                22S IN A        94.100.191.207
        mail.ru.                22S IN A        94.100.191.207
        mail.ru.                22S IN A        94.100.191.207
        mail.ru.                22S IN A        94.100.191.207
        mail.ru.                22S IN A        94.100.191.207
        mail.ru.                22S IN A        94.100.191.207
        mail.ru.                22S IN A        94.100.191.207
        mail.ru.                22S IN A        94.100.191.207
        mail.ru.                22S IN A        94.100.191.207
        mail.ru.                22S IN A        94.100.191.207
        mail.ru.                22S IN A        94.100.191.207
MX records :
        mail.ru.                1m57s IN MX     10 mxs.mail.ru.
NS records :
        mail.ru.                1m50s IN NS     ns.mail.ru.
        mail.ru.                1m50s IN NS     ns.mail.ru.
        mail.ru.                1m50s IN NS     ns.mail.ru.
        mail.ru.                1m50s IN NS     ns.mail.ru.
        mail.ru.                1m50s IN NS     ns.mail.ru.
        mail.ru.                1m50s IN NS     ns.mail.ru.

Please help.请帮忙。

In this call: 在这个电话中:

  ns_parserr(&msg, ns_s_an, 0, &rr);

The third argument is the index of the record you want to retrieve. 第三个参数是要检索的记录的索引。 So in your case it should be: 所以在你的情况下它应该是:

  ns_parserr(&msg, ns_s_an, i, &rr);

Just tried your code with that minor fix, and it works as expected: 刚尝试使用那个小修补程序的代码,它按预期工作:

Domain : mail.ru
A records : 
    mail.ru.        5S IN A     94.100.191.248 
    mail.ru.        5S IN A     94.100.191.249 
    mail.ru.        5S IN A     94.100.191.250 
    mail.ru.        5S IN A     94.100.191.201 
    mail.ru.        5S IN A     94.100.191.202 
    mail.ru.        5S IN A     94.100.191.203 
    mail.ru.        5S IN A     94.100.191.204 
    mail.ru.        5S IN A     94.100.191.205 
    mail.ru.        5S IN A     94.100.191.206 
    mail.ru.        5S IN A     94.100.191.207 
    mail.ru.        5S IN A     94.100.191.208 
    mail.ru.        5S IN A     94.100.191.209 
    mail.ru.        5S IN A     94.100.191.210 
    mail.ru.        5S IN A     94.100.191.241 
    mail.ru.        5S IN A     94.100.191.242 
    mail.ru.        5S IN A     94.100.191.243 
    mail.ru.        5S IN A     94.100.191.244 
    mail.ru.        5S IN A     94.100.191.245 
    mail.ru.        5S IN A     94.100.191.246 
    mail.ru.        5S IN A     94.100.191.247 
MX records : 
    mail.ru.        7m14s IN MX 10 mxs.mail.ru.
NS records : 
    mail.ru.        3m35s IN NS ns2.mail.ru. 
    mail.ru.        3m35s IN NS ns.mail.ru. 
    mail.ru.        3m35s IN NS ns4.mail.ru. 
    mail.ru.        3m35s IN NS ns5.mail.ru. 
    mail.ru.        3m35s IN NS ns1.mail.ru. 
    mail.ru.        3m35s IN NS ns3.mail.ru.

With Ubuntu 20.04 and more,使用 Ubuntu 20.04 及以上,

 res_query(argv[1], ns_c_any, ns_t_mx, nsbuf, sizeof(nsbuf));

fail.失败。 Please replace ns_c_any by ns_c_in请用 ns_c_in 替换 ns_c_any

 res_query(argv[1], ns_c_in, ns_t_mx, nsbuf, sizeof(nsbuf));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM