क्या लिनक्स पर सी में कोई फ़ंक्शन है जिसके द्वारा हम एमएक्स रिकॉर्ड (जैसे gethostbyname) से पूछ सकते हैं।सी लिनक्स में एमएक्स रिकॉर्ड क्वेरी
उत्तर
-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;
}
क्या हमें इस कार्यक्रम को चलाने के लिए कुछ बाहरी पुस्तकालय की आवश्यकता है? – avd
जैसा कि मैंने पहले ही उल्लेख किया है: इसे 'libresolv' की आवश्यकता है, जो मूल रूप से BIND प्रोजेक्ट से आता है (लेकिन glibc की प्रतिलिपि है)। – ephemient
इस पुस्तकालय को कैसे स्थापित करें? क्या हम किसी बाहरी पुस्तकालय के बिना एमएक्स क्वेरी कर सकते हैं? – avd
मैं बस उपरोक्त उत्तर में जोड़ना चाहता हूं। मुझे संकलन त्रुटियां मिल रही थीं। खोज करने के बाद, मुझे संकलित करने के तरीके पर एक मंच पर मिला। पहला प्रयोग मुख्य समारोह के रूप में (जैसे कि 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)
यदि आप '/ usr/lib/libresolv.so' खो रहे हैं, तो आपको अभी भी 'libresolv.a' पर इंगित करने के बजाय' -Wl, -Bstatic -lresolv' का उपयोग करना चाहिए। – ephemient
लेकिन उपरोक्त विकल्प – avd
पर काम नहीं करते हैं आपको पुस्तकालय के पथ निर्दिष्ट करने की आवश्यकता नहीं है। जो समस्या आप शायद देख रहे हैं वह यह है कि '-resresolv' के बाद पुस्तकालयों को जोड़ा जा रहा है जिसके लिए कोई स्थिर संस्करण उपलब्ध नहीं है। तो आप इसके बजाय ऐसा कर सकते हैं: '-ब्लूएल, -बस्टैटिक-लेर्सोलव -ब्लूएल, -बैडेमिक', या अधिक संक्षेप में: '-स्टैटिक-लेर्सोलव-गतिशील'। – jxh
यह संकलित करें यह कोई डुप्लिकेट का डुप्लिकेट है। –
PLease इसे हटा नहीं है। अन्य पोस्ट में पूर्ण जवाब नहीं हैं। यह पूरी तरह से समस्या को ठीक करता है। – avd