टीसीपी मजबूत करने के लिए है अच्छी हालत में हैं एक कठोर नेटवर्क के चेहरे में; भले ही टीसीपी एक सतत अंत-टू-एंड कनेक्शन की तरह दिखता है, यह सब सिर्फ एक झूठ है, प्रत्येक पैकेट वास्तव में सिर्फ एक अद्वितीय, अविश्वसनीय डेटाग्राम है।
कनेक्शन वास्तव में कनेक्शन के प्रत्येक छोर पर ट्रैक किए गए छोटे राज्य के साथ बनाए गए वर्चुअल कंडिट हैं (स्रोत और गंतव्य बंदरगाहों और पते, और स्थानीय सॉकेट)। नेटवर्क स्टैक इस राज्य का उपयोग यह जानने के लिए करता है कि प्रत्येक आने वाली पैकेट को कौन सी प्रक्रिया देना है और प्रत्येक आउटगोइंग पैकेट के शीर्षलेख में क्या स्थिति डालना है।
अंतर्निहित — स्वाभाविक संयोजन और अविश्वसनीय — नेटवर्क की प्रकृति के कारण
, ढेर केवल एक कटे हुए कनेक्शन रिपोर्ट दूरदराज के अंत एक फिन पैकेट भेजता है कनेक्शन बंद करने के लिए होगा, या यदि वह नहीं करता है ' एक भेजे गए पैकेट (एक टाइमआउट और दो रिट्रीज़ के बाद) को एसीके प्रतिक्रिया प्राप्त नहीं होती है।
एएसओ की असीमित प्रकृति की वजह से, एक सुंदर डिस्कनेक्शन के अधिसूचित होने का सबसे आसान तरीका एक उत्कृष्ट async_read
है जो कनेक्शन बंद होने पर तुरंत error::eof
लौटाएगा। लेकिन यह अकेले अभी भी अन्य मुद्दों की संभावना छोड़ देता है जैसे अर्ध-खुले कनेक्शन और नेटवर्क मुद्दे ज्ञात नहीं जा रहे हैं।
अप्रत्याशित कनेक्शन बाधा के आसपास काम करने का सबसे प्रभावी तरीका किसी प्रकार के जीवित या पिंग का उपयोग करना है। कनेक्शन पर डेटा स्थानांतरित करने का यह कभी-कभी प्रयास अनजाने में अलग कनेक्शन के त्वरित पहचान की अनुमति देगा।
टीसीपी प्रोटोकॉल में वास्तव में अंतर्निहित keep-alive mechanism है जिसे asio::tcp::socket::keep_alive
का उपयोग करके एएसओ में कॉन्फ़िगर किया जा सकता है। टीसीपी को जीवित रखने के बारे में अच्छी बात यह है कि यह उपयोगकर्ता-मोड एप्लिकेशन के लिए पारदर्शी है, और केवल रहने वाले लोगों में दिलचस्पी रखने वाले सहकर्मी इसे कॉन्फ़िगर करते हैं। नकारात्मकता यह है कि आपको टाइमआउट पैरामीटर को कॉन्फ़िगर करने के लिए ओएस लेवल एक्सेस/ज्ञान की आवश्यकता होती है, दुर्भाग्य से वे एक साधारण सॉकेट विकल्प के माध्यम से प्रकट नहीं होते हैं और आमतौर पर डिफ़ॉल्ट टाइमआउट मान होते हैं जो काफी बड़े होते हैं (लिनक्स पर 7200 सेकेंड)।
शायद जीवित रहने की सबसे आम विधि इसे एप्लिकेशन परत पर कार्यान्वित करना है, जहां एप्लिकेशन के पास विशेष नोप या पिंग संदेश होता है और टिक्बल होने पर प्रतिक्रिया के अलावा कुछ भी नहीं करता है। यह विधि आपको एक जीवित रणनीति को लागू करने में सबसे लचीलापन प्रदान करती है।
संभावित डुप्लिकेट [कैसे जांचें कि Boost.Asio में सॉकेट बंद है या नहीं?] (Http://stackoverflow.com/questions/818665/how-to-check-if-socket-is-closed-in-boost -asio) – joshperry