ऐसे मामले हो सकते हैं जब एक सॉकेट तैयार होने की सूचना दी जाती है लेकिन जब तक आप इसे जांचते हैं, तो यह इसके राज्य को बदल देता है।
अच्छे उदाहरणों में से एक कनेक्शन स्वीकार कर रहा है। जब कोई नया कनेक्शन आता है, तो सुनने के लिए तैयार एक सुनवाई सॉकेट की सूचना दी जाती है। जब तक आप कॉल स्वीकार करते हैं, तब तक कनेक्शन को किसी भी तरफ भेजने से पहले दूसरी तरफ बंद कर दिया जा सकता है और इससे पहले कि हम accept
कहें। बेशक, इस मामले का संचालन ओएस-निर्भर है, लेकिन यह संभव है कि accept
बस एक नया कनेक्शन स्थापित होने तक अवरुद्ध हो जाएगा, जिससे हमारे आवेदन अन्य सॉकेट की प्रसंस्करण को रोकने में अनिश्चित अवधि के लिए इंतजार कर सकते हैं। यदि आपकी सुनवाई सॉकेट एक गैर-अवरुद्ध मोड में है, तो ऐसा नहीं होगा और आपको EWOULDBLOCK
या कुछ अन्य त्रुटि मिल जाएगी, लेकिन accept
वैसे भी अवरुद्ध नहीं होगा।
कुछ कर्नेल का उपयोग होता था (मुझे उम्मीद है कि यह अब तय है) यूडीपी और select
के साथ एक दिलचस्प बग है। जब एक डेटाग्राम आता है select
सॉकेट के साथ जागता है जिसे डेटाग्राम पढ़ने के लिए तैयार के रूप में चिह्नित किया जाता है। डेटाग्राम चेकसम सत्यापन तब तक स्थगित कर दिया जाता है जब तक कोई उपयोगकर्ता कोड recvfrom
(या यूडीपी डेटाग्राम प्राप्त करने में सक्षम कुछ अन्य एपीआई) कॉल करता है। जब कोड recvfrom
पर कॉल करता है और सत्यापन कोड चेकसम मिस्चैच का पता लगाता है, तो डेटाग्राम को आसानी से गिरा दिया जाता है और recvfrom
अगले डेटाग्राम आने तक अवरुद्ध हो जाता है। इस समस्या को हल करने वाले पैच में से एक (समस्या विवरण के साथ) here पाया जा सकता है।
स्रोत
2012-10-07 21:12:58
आह, इसके लिए धन्यवाद। :) – CaptainCodeman