मेरा कोड विभिन्न सॉकेट ऑपरेशंस करने के लिए एक थ्रेड में बूस्ट :: एएसओ और io_service का उपयोग करता है। सभी ऑपरेशन एसिंक्रोनस हैं और ऑपरेशन के परिणाम को निर्धारित करने के लिए प्रत्येक हैंडलर boost::system::error_code
(विशेष रूप से boost::asio::error::operation_aborted
) पर निर्भर करता है।बूस्ट :: रद्दीकरण के बाद त्रुटि के बिना एएसआई एसिंक हैंडलर
यह पूरी तरह से अच्छा काम कर रहा है जब तक कि मैंने कई समवर्ती कनेक्शन बनाने और सबसे तेज़ चुनने के लिए तर्क बदल दिया है। यही है, जब पहली async_read_some
हैंडलर आग लगती है, तो मैं अन्य सॉकेट (शट डाउन, क्लोज़ - सबकुछ) रद्द करता हूं और वर्तमान के साथ आगे बढ़ता हूं। 95% मामलों में अन्य सॉकेट के पढ़ने वाले हैंडलर को ऑपरेशन_बॉर्टेड त्रुटि के साथ बुलाया जाता है। हालांकि कभी-कभी, इन पढ़ने वाले हैंडलर त्रुटियों के बिना बुलाए जाते हैं, मुझे बताते हैं कि उन्हें सफलतापूर्वक एन बाइट प्राप्त हुए हैं।
लेकिन सॉकेट के लिए दस्तावेज़ :: रद्द() states:
इस समारोह सभी बकाया अतुल्यकालिक कनेक्ट, भेजने का कारण बनता है और संचालन प्राप्त तुरंत समाप्त करने के लिए, और रद्द संचालन के लिए संचालकों पारित हो जाएगा
boost::asio::error::operation_aborted
त्रुटि।
तो, प्रश्न: क्या मैं वास्तव में उत्पादन कोड में operation_aborted
त्रुटि पर भरोसा कर सकता हूं? यदि मैं कर सकता हूं, क्या यह एएसओओ में 1.46.1 से बढ़कर एक बग है? यदि मैं नहीं कर सकता, तो क्या इसके बारे में कोई आधिकारिक दस्तावेज है?
ऐसा लगता है कि रद्द करने से पहले कई हैंडलर "सफल" हो चुके हैं। आप किसी भी हैंडलर को पास करने के लिए 'operation_aborted' पर भरोसा कर सकते हैं, जो पहले से निष्पादित नहीं है (और कॉल करने का इंतजार कर रहे हैं)। – Chad