2009-11-06 11 views
5

क्या लिनक्स पर सी में कोई फ़ंक्शन है जिसके द्वारा हम एमएक्स रिकॉर्ड (जैसे gethostbyname) से पूछ सकते हैं।सी लिनक्स में एमएक्स रिकॉर्ड क्वेरी

+0

यह संकलित करें यह कोई डुप्लिकेट का डुप्लिकेट है। –

+0

PLease इसे हटा नहीं है। अन्य पोस्ट में पूर्ण जवाब नहीं हैं। यह पूरी तरह से समस्या को ठीक करता है। – avd

उत्तर

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

+0

जैसा कि मैंने पहले ही उल्लेख किया है: इसे 'libresolv' की आवश्यकता है, जो मूल रूप से BIND प्रोजेक्ट से आता है (लेकिन glibc की प्रतिलिपि है)। – ephemient

+0

इस पुस्तकालय को कैसे स्थापित करें? क्या हम किसी बाहरी पुस्तकालय के बिना एमएक्स क्वेरी कर सकते हैं? – avd

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' खो रहे हैं, तो आपको अभी भी 'libresolv.a' पर इंगित करने के बजाय' -Wl, -Bstatic -lresolv' का उपयोग करना चाहिए। – ephemient

+0

लेकिन उपरोक्त विकल्प – avd

+0

पर काम नहीं करते हैं आपको पुस्तकालय के पथ निर्दिष्ट करने की आवश्यकता नहीं है। जो समस्या आप शायद देख रहे हैं वह यह है कि '-resresolv' के बाद पुस्तकालयों को जोड़ा जा रहा है जिसके लिए कोई स्थिर संस्करण उपलब्ध नहीं है। तो आप इसके बजाय ऐसा कर सकते हैं: '-ब्लूएल, -बस्टैटिक-लेर्सोलव -ब्लूएल, -बैडेमिक', या अधिक संक्षेप में: '-स्टैटिक-लेर्सोलव-गतिशील'। – jxh

संबंधित मुद्दे