2009-11-06 45 views
5

C上有什麼函數可以用來查詢MX記錄(比如gethostbyname)。在C中查詢MX記錄linux

+0

這是一個重複的副本。 – 2009-11-06 15:53:49

+0

PLease不要刪除這個。其他文章沒有完整的答案。這完全解決了這個問題。 – avd 2009-11-06 19:21:13

回答

7

鏈接-lresolv(BIND的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; 
} 
+0

我們是否需要一些外部庫來運行這個程序? – avd 2009-11-06 16:08:05

+0

正如我已經提到:這需要'libresolv',它最初來自BIND項目(但glibc有一個副本)。 – ephemient 2009-11-06 16:11:55

+0

如何安裝此庫?我們可以不用任何外部庫來做MX查詢嗎? – avd 2009-11-06 16:17:48

1

我只是想補充上面的答案。我收到編譯錯誤。搜索後,我在一個論壇上討論如何編譯。首次使用主要功能(比如用於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) 
+0

如果你缺少'/ usr/lib/libresolv.so',你應該仍然使用'-Wl,-Bstatic -lresolv'而不是直接指向'libresolv.a'。 – ephemient 2009-11-06 19:55:41

+0

但上述選項不起作用 – avd 2009-11-08 05:07:23

+0

您不必指定庫的路徑。你可能看到的問題是,在'-lresolv'之後有一些庫沒有可用的靜態版本。所以你可以這樣做:'-Wl,-Bstatic -lresolv -Wl,-Bdynamic',或者更簡潔:'-static -lresolv -dynamic'。 – jxh 2013-09-12 21:39:06