Запросы MX записывают в Linux C

Если Вы хотите обозначить фактическую ошибку в своем коде, Вы могли бы повысить RuntimeError исключение:

raise RuntimeError, 'Message goes here'

Это распечатает stacktrace, тип повышаемого исключения и сообщение, что Вы обеспечили. В зависимости от Ваших пользователей stacktrace мог бы быть слишком страшным, и фактическое сообщение могло бы потеряться в шуме. С другой стороны, если Вы умрете из-за фактической ошибки, stacktrace даст Вам дополнительную информацию для отладки.

5
задан FooF 21 August 2015 в 03:36
поделиться

2 ответа

Ссылка на -lresolv (BIND's libresolv ).

#include <arpa/inet.h>
#include <resolv.h>
#include <string.h>

int resolvmx(const char *name, char **mxs, int limit) {
    unsigned char response[NS_PACKETSZ];  /* big enough, right? */
    ns_msg handle;
    ns_rr rr;
    int mx_index, ns_index, len;
    char dispbuf[4096];

    if ((len = res_search(name, C_IN, T_MX, response, sizeof(response))) < 0) {
        /* WARN: res_search failed */
        return -1;
    }

    if (ns_initparse(response, len, &handle) < 0) {
        /* WARN: ns_initparse failed */
        return 0;
    }

    len = ns_msg_count(handle, ns_s_an);
    if (len < 0)
        return 0;

    for (mx_index = 0, ns_index = 0;
            mx_index < limit && ns_index < len;
            ns_index++) {
        if (ns_parserr(&handle, ns_s_an, ns_index, &rr)) {
            /* WARN: ns_parserr failed */
            continue;
        }
        ns_sprintrr (&handle, &rr, NULL, NULL, dispbuf, sizeof (dispbuf));
        if (ns_rr_class(rr) == ns_c_in && ns_rr_type(rr) == ns_t_mx) {
            char mxname[MAXDNAME];
            dn_expand(ns_msg_base(handle), ns_msg_base(handle) + ns_msg_size(handle), ns_rr_rdata(rr) + NS_INT16SZ, mxname, sizeof(mxname));
            mxs[mx_index++] = strdup(mxname);
        }
    }

    return mx_index;
}
7
ответ дан 14 December 2019 в 04:41
поделиться

I просто хочу добавить к приведенному выше ответу. Я получал ошибки компиляции. После поиска я попал на один форум о том, как компилировать. Сначала используйте основную функцию как (например, gmail.com)

main(){
char *mxs[10];
int a;
printf("%d\n",a=resolvmx("gmail.com",mxs,10));
printf("%s\n",mxs[a-1]);
}

, а затем скомпилируйте ее как

gcc <pname.c> /usr/lib/libresolv.a   (instead of gcc pname.c -lresolv)
1
ответ дан 14 December 2019 в 04:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: