2008-09-24 5 views
6

यदि हमारा सर्वर (डिवाइस पर चल रहा है) एक डीएचसीपी पट्टा अधिग्रहण से पहले शुरू होता है तो यह होस्टनाम का उपयोग करके कभी भी कनेक्ट नहीं हो सकता है।glibc का उपयोग करके, I/DHCP ने DNS सर्वर को बदलने के बाद मेरा gethostbyname क्यों विफल हो गया?

यदि ऐसा होता है तो यह होस्ट को आईपी पते से ढूंढ सकता है लेकिन DNS द्वारा नहीं।

मैंने शुरू में सोचा कि कर्ल DNS कैश गलती पर था क्योंकि कर्ल कनेक्शन विफल हो गए थे। लेकिन मैंने कैशिंग पते से कर्ल को रोकने के लिए CURLOPT_DNS_CACHE_TIMEOUT का उपयोग किया लेकिन कनेक्शन अभी भी विफल रहे।

+0

क्या मैं इस प्राचीन प्रश्न को खारिज कर सकता हूं कि क्या कोई अन्य समाधान है या नहीं? समस्या यह है कि 'lib_init()' 'libcurl' API से बहुत कम पोर्टेबल है। कुछ कर्ल-सहायक प्लेटफार्मों पर यह अस्तित्व में नहीं है; कई अन्य लोगों पर यह धागा-सुरक्षित नहीं है। – NickJH

उत्तर

9

यह पता चला है कि अगर यह कॉन्फ़िगरेशन बदलता है तो glibc gethostbyname_r स्वचालित रूप से इसके कॉन्फ़िगरेशन को पुनः लोड नहीं करेगा। आपको res_init मैन्युअल रूप से कॉल करना होगा। नीचे bug report देखें।

नोट: न तो gethostbyname_r के लिए मैन पेज और न ही rer_init के लिए इस सीमा का उल्लेख किया गया है।

मेरा समाधान बहुत विशिष्ट है। यह हमारे लंबे चलने वाले सर्वर के लिए काम करता है लेकिन यह मेरा आदर्श समाधान नहीं है।

मेरे पास एक ऐसा फ़ंक्शन है जो अंतिम ज्ञात mtime (0 डीएनई के लिए 0) के खिलाफ /etc/resolv.conf के mtime की जांच करता है। यदि दो mtime भिन्न हैं तो मैं res_init को कॉल करता हूं। यह फ़ंक्शन प्रोग्राम स्टार्टअप पर और फिर समय-समय पर कॉन्फ़िगरेशन को वैकल्पिक रूप से पुनः लोड करने के लिए कहा जाता है।


glibc bug report

libc कैश हमेशा के लिए

resolv.conf ...

क्या res_init है कि() है के लिए, यह कहते हैं।

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