2010-01-28 20 views
16

getaddrinfo() एक ऐसा फ़ंक्शन है जिसे हमें से पहले सॉकेट() या कनेक्ट() आईएनजी बनाने से पहले उपयोग करने की आवश्यकता है, है ना? फिर getaddrinfo DNS सर्वर के साथ पहली जगह कैसे संचार करता है?getaddrinfo() DNS लुकअप कैसे करता है?

पीएस: मैं getaddrinfo का पूरा स्रोत कहां देख सकता हूं?

+0

मुझे खेद है कि अगर यह ज्यादा समझ में नहीं आता है .. केवल दो दिन पहले यूनिक्स नेटवर्क प्रोग्रामिंग सीखना शुरू किया- मैं काफी उलझन में हूं। – n00b2000

+0

आपको सॉकेट बनाने से पहले या कनेक्ट() कॉल करने से पहले getaddrinfo() को कॉल करने की आवश्यकता नहीं है। –

+0

कनेक्ट() को गंतव्य होस्ट के आईपी पते को बताया जाना चाहिए। और इसके लिए, हमें getaddrinfo() –

उत्तर

-1

यह DNS प्रोटोकॉल (यूडीपी) http://www.freesoft.org/CIE/Topics/77.htm

+1

गलत का उपयोग कर आईपी लुकअप में होस्टनाम करने की आवश्यकता है।स्टीव Emmerson के जवाब देखें। – bortzmeyer

+0

यह नहीं है? क्या तुम साबित कर सकते हो? – Zepplock

+0

आप अपने nsswitch.conf को केवल/etc/hosts पर भरोसा करने के लिए बदल सकते हैं और किसी भी डीएनएस लुकअप नहीं कर सकते हैं। –

4

संक्षिप्त उत्तर "यह प्रणाली पूछते हैं,", जो बारी में जानता है DNS खोज और जो सर्वर का उपयोग करने कैसे करना है इस्तेमाल कर रहा है।

getaddrinfo()getaddrinfo(3) मैनुअल पेज द्वारा दस्तावेज किया गया है, जिसका अर्थ है कि यह एक सी लाइब्रेरी फ़ंक्शन है। यह POSIX फ़ंक्शन भी है, इसलिए कोई कैनोलिक "स्रोत" नहीं है; एक ऑपरेटिंग सिस्टम की प्रत्येक मानक सी लाइब्रेरी जो POSIX के अनुरूप है, अपने संस्करण को कार्यान्वित करेगी। किसी भी तरह से उस फ़ंक्शन को स्रोत संभवतः बहुत प्रबुद्ध नहीं है, क्योंकि यह केवल अन्य फ़ंक्शंस और ओएस एपीआई को कॉल करेगा, और आपको वास्तविक DNS तंत्र तक पहुंचने के लिए बहुत दूर ड्रिल करना होगा। यदि आप रुचि रखते हैं तो आप रुचि रखते हैं तो आप डीएनएस प्रोटोकॉल के दस्तावेज़ीकरण को पढ़ने से बेहतर होंगे।

+2

यह पूरी तरह से गलत है। यूनिक्स ऑपरेटिंग सिस्टम में DNS लुकअप सुविधा में निर्मित नहीं है। यह मानक पुस्तकालय में उपयोगकर्ता स्थान में किया जाता है। http://code.metager.de/source/xref/eglibc/libc/sysdeps/posix/getaddrinfo.c –

+0

@ हैन्सलैंडहोल्म मुझे लगता है कि यहां नज़र है कि यूनिक्स * कर्नेल * में अंतर्निहित DNS लुकअप सुविधा नहीं है , लेकिन "सिस्टम", शब्द की अधिक सामान्य समझ में, उपयोगकर्ता सेवा सेवाओं को शामिल करता है जो सिस्टम के साथ शिप करते हैं। – mtraceur

1

getaddrinfo() संभावना पर्दे के पीछे एक connect() कॉल कर करता है, लेकिन यह पहले से ही DNS सर्वर यह मेजबान आप के लिए क्वेरी करने के लिए यह कह रहे हैं की पते के लिए क्वेरी करने के लिए के लिए कनेक्ट करने की जरूरत के आईपी पते को जानता है।

getaddrinfo() केवल यदि आप "www.somehost.com" एक आईपी पता करने के लिए मैप करना चाहते हैं की जरूरत है, यह एक प्राइमर connect() कॉल करने के लिए के रूप में की जरूरत नहीं है।

आपको शायद getaddrinfo() के लिए ग्लिब स्रोतों में पूरा स्रोत कोड मिल सकता है, जिसे आप यहां (अन्य स्थानों के साथ) ढूंढ पाएंगे।

आशा है कि आपके लिए चीजों को स्पष्ट करे।

+2

यदि आप देखना चाहते हैं कि glibc नाम लुकअप कैसे करता है, तो यहां प्रारंभ करें: http://cvs.savannah.gnu.org/viewvc/libc/resolv/nss_dns/dns-host.c?revision=1.57&root=libc&view=markup (सावधान रहें: यह ** जटिल ** है)। – caf

10

सॉकेट या कनेक्ट करने से पहले getaddrinfo() पर कॉल करना आवश्यक नहीं है। इसका उपयोग डोमेन नाम का अनुवाद करने के लिए किया जाता है, जैसे stackoverflow.com, 69.59.196.211 जैसे आईपी पते पर। यदि आप आईपी पते जानते हैं तो आप सीधे उस पते से कनेक्ट कर सकते हैं और getaddrinfo() का उपयोग करने की आवश्यकता नहीं है। getaddrinfo() आपके नाम सर्वर से बात करने के लिए DNS प्रोटोकॉल का उपयोग करता है, जो उनके आईपी पते का उपयोग करके कॉन्फ़िगर किया गया है।

glibc स्रोत कोड here है।

+0

मुझे एक बात बताएं, अगर मैं रिवर्स डीएनएस लुकअप करना चाहता हूं तो कौन सी सिस्टम कॉल की आवश्यकता है? – devsda

+2

पता-से-नाम रिवर्स DNS लुकअप के लिए 'getnameinfo()' का उपयोग करें। – mark4o

7

क्या आपके यूनिक्स सिस्टम में फ़ाइल /etc/nsswitch.conf है? यदि ऐसा है, तो "होस्ट" प्रविष्टि होस्ट पते को आईपी पते में हल करने के लिए खोज आदेश देती है। क्या आपके सिस्टम में फ़ाइल /etc/resolv.conf है? यदि ऐसा है, तो यह निर्दिष्ट करता है कि कौन से DNS सर्वर का उपयोग करना है।

जैसा कि आप देख सकते हैं, getaddrinfo() काफी कुछ कर सकता है (और कुछ समय ले सकता है)!

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