2009-11-06 28 views
5

Có chức năng nào trong C trên linux mà chúng tôi có thể truy vấn bản ghi MX (như gethostbyname).?Truy vấn bản ghi MX trong C linux

+0

Đây là một bản sao của một bản sao. –

+0

Xin đừng xóa cái này. Bài đăng khác không có câu trả lời hoàn chỉnh. Điều này hoàn toàn khắc phục vấn đề. – avd

Trả lời

7

Liên kết với -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; 
} 
+0

Chúng ta có cần một số thư viện bên ngoài để chạy chương trình này không? – avd

+0

Như tôi đã đề cập: điều này cần 'libresolv', mà ban đầu xuất phát từ dự án BIND (nhưng glibc có một bản sao). – ephemient

+0

Cách cài đặt thư viện này? Không, chúng tôi có thể truy vấn MX mà không có bất kỳ thư viện bên ngoài nào không? – avd

1

Tôi chỉ muốn thêm vào câu trả lời ở trên. Tôi đã nhận được lỗi biên dịch. Sau khi tìm kiếm, tôi đã có một diễn đàn về cách biên dịch. Đầu tiên sử dụng chức năng chính như (đối với tiếng nói gmail.com)

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

và sau đó biên dịch nó như

gcc <pname.c> /usr/lib/libresolv.a (instead of gcc pname.c -lresolv) 
+0

Nếu bạn đang thiếu '/ usr/lib/libresolv.so', bạn vẫn nên sử dụng' -Wl, -Bstatic -lresolv' thay vì trỏ trực tiếp đến 'libresolv.a'. – ephemient

+0

nhưng Các tùy chọn trên không hoạt động – avd

+0

Bạn không phải chỉ định đường dẫn đến thư viện. Vấn đề bạn có thể thấy là có các thư viện được liên kết sau '-lresolv' mà không có sẵn các phiên bản tĩnh. Vì vậy, bạn có thể làm điều này thay vào đó: '-Wl, -Bstatic -lresolv -Wl, -Bdynamic', hoặc ngắn gọn hơn:' -static -lresolv -dynamic'. – jxh

Các vấn đề liên quan