2012-03-29 8 views
6

मैं क्लाइंट/सर्वर एप्लिकेशंस को लागू करने के लिए बूस्ट :: एएसओ का उपयोग कर रहा हूं। नीचे दिए गए क्लाइंट कोड का उपयोग रिमोट सर्वर से कनेक्ट करने के लिए किया जाता है।Boost :: asio में सॉकेट कनेक्शन लाइव होने पर कैसे जांचें?

try 
    { 
     boost::asio::io_service   m_io_service; 
     boost::asio::ip::tcp::socket m_socket(m_io_service); 
     boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::address::from_string("127.0.0.1"), 17); 
     m_socket.connect(endpoint); 
    } 
    catch (std::exception& e) 
    { 
     std::cerr << e.what() << std::endl; 
    } 

ग्राहक पक्ष में, मैं जांचना चाहता हूं कि कनेक्शन लाइव है या नहीं। फ़ंक्शन "m_socket.is_open();" काम नहीं करता है। जब सर्वर सॉकेट बंद हो जाता है, तो "m_socket.is_open();" अभी भी क्लाइंट पक्ष पर सत्य लौटाता है। क्या कनेक्शन की जांच करने का कोई तरीका है?

+1

मुझे यहां एक समान संदेह था: http://stackoverflow.com/q/1511129/174605 और joshperry – coelhudo

उत्तर

2

अंतर्निहित सॉकेट इंटरफ़ेस की सीमा के कारण, सॉकेट स्तर पर टीसीपी कनेक्शन स्थिति की जांच करने के लिए कनेक्ट किए गए फ़ंक्शन को कार्यान्वित करने का कोई तरीका नहीं है। मुझे इसके बारे में एक कामकाज लगता है।

मेरे कार्यान्वयन में, मैं अपने आवेदन में कनेक्शन स्थिति ध्वज (bool m_IsConnected) कैश करता हूं। इस ध्वज का उपयोग कनेक्शन स्थिति को निर्दिष्ट करने के लिए किया जाता है। यह मानता है कि यदि सॉकेट से कोई त्रुटि नहीं है, तो टीसीपी कनेक्शन जिंदा है।

ध्वज सॉकेट का उपयोग करते समय हर बार अपडेट किया जाएगा। यदि डेटा भेजने और पढ़ने के दौरान त्रुटियां हैं, तो इसका मतलब है कि कनेक्शन डिस्कनेक्ट हो गया है। फिर झंडे को संगत रूप से बदलें। यदि टीसीपी कनेक्शन लंबे समय तक निष्क्रिय है। यह ध्वज सॉकेट का उपयोग करते समय टीसीपी कनेक्शन की वास्तविक स्थिति को प्रतिबिंबित नहीं करता है। उदाहरण के लिए, सॉकेट लंबे समय तक निष्क्रिय है। खराब नेटवर्क के कारण यह डिस्कनेक्ट हो गया है। इस मामले में, m_Is कनेक्ट किया गया अभी भी सत्य है क्योंकि हमें डिस्कनेक्शन ईवेंट के बारे में कोई कॉलबैक नहीं मिलता है। इस सॉकेट के माध्यम से डेटा भेजने का प्रयास करते समय, त्रुटि होगी। और अब हम जानते हैं कि कनेक्शन डिस्कनेक्ट हो गया है।

0

यह अंतर्निहित सॉकेट इंटरफेस की एक सीमा है (मुझे लगता है कि दोनों विंसॉक/बेकरली के लिए)। आप विशेष रूप से इस उद्देश्य के लिए एक संदेश का आविष्कार कर सकते हैं, कि सर्वर उत्तर देने पर उत्तर देता है। अन्यथा यदि आप टाइमआउट प्राप्त करते हैं, तो कनेक्शन नीचे है।

संपादित करें: जैसा कि जोआचिम ने बताया, सॉकेट पढ़ने की कोशिश करना एक बेहतर तरीका हो सकता है।

+3

द्वारा एक अच्छा जवाब है जो बंद होने वाले कनेक्शन को भेजने की कोशिश कर रहा है, भले ही कोई त्रुटि दे यह एक साफ और उचित बंद था। सॉकेट से _read_ करने का प्रयास करने से सॉकेट बंद होने के बारे में एक बेहतर संकेत मिलेगा (यानी 'रीड' या 'रिकिव' शून्य के पास शून्य बंद हो जाता है या त्रुटि होने पर त्रुटि होती है।) –

+0

आह हाँ आप सही हैं, मैं भूल गया कि आप इसे भी पढ़ सकते हैं। उपरोक्त उत्तर अपडेट करेंगे। – Rolle

+0

मुफ्त फ़ंक्शन बूस्ट :: asio :: read सॉकेट को पढ़ने के लिए उपयोग किया जा सकता है। मुझे लगता है कि रीड फ़ंक्शन का उपयोग करते हुए साइड-इफेक्ट होता है तो कनेक्शन स्थिति का पता लगाता है। यह सॉकेट स्ट्रीम से डेटा पढ़ेगा, जिसे मैं स्थिति पहचान फ़ंक्शन में नहीं चाहता हूं। इसके अलावा, अगर कनेक्शन जिंदा है, तो फंक्शन फंक्शन ब्लॉक। – Jeffrey