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
Trả lời
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;
}
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
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
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
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)
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
nhưng Các tùy chọn trên không hoạt động – avd
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
Đây là một bản sao của một bản sao. –
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