2009-05-12 17 views
7

मेरे पास एक सी ++ ऐप है जो मानक सॉकेट कॉल का उपयोग करता है और मैं जानना चाहता हूं कि क्या मैं बता सकता हूं कि कोई सॉकेट अभी भी कोई डेटा भेजने या प्राप्त किए बिना खुला है या नहीं। क्या कोई विश्वसनीय select या ioctlsocket कॉल कर सकता हूं?मैं कैसे जांच सकता हूं कि एक सॉकेट अभी भी खुला है?

+0

क्या आपका मतलब यह है कि दूसरी तरफ सॉकेट बंद कर दिया गया है या नहीं? –

+0

हां। मेरा ऐप विंडोज पर चलता है और यदि पीसी हाइबरनेट किया जाता है, तो जब यह सॉकेट लौटाता है तो यह मान्य नहीं होगा क्योंकि दूसरे छोर ने इसे बंद कर दिया है (और जैसा कि मेरा ऐप निलंबित है, मुझे कोई सूचना नहीं मिली है)। – Rob

उत्तर

7

यदि आप एक बाइट प्राप्त करने का प्रयास करते हैं, तो आप कई त्रुटियों को प्राप्त कर सकते हैं, यदि आप एक गैर-अवरुद्ध सॉकेट रखते हैं, और वैध कनेक्शन पर प्राप्त करने का प्रयास करते हैं, तो आपको त्रुटि WSAEWOULDBLOCK मिल जाएगी।

यह जानने के बाद हम इतनी

bool connected(SOCKET sock) 
{ 
    char buf; 
    int err = recv(sock, &buf, 1, MSG_PEEK); 
    if(err == SOCKET_ERROR) 
    { 
      if(WSAGetLastError() != WSAEWOULDBLOCK) 
      {return false;} 
    } 
    return true; 
} 

की तरह एक गैर अवरुद्ध सॉकेट जांच कर सकते हैं के रूप में आप return value of recv recv से देख सकते हैं एक समय समाप्ति या डिस्कनेक्ट के लिए कई अन्य त्रुटियों वापस आ सकते हैं, मैं belive WSAEWOULDBLOCK केवल मूल्य भी हो रहा है अगर कोई त्रुटि हुई लेकिन फिर भी कनेक्ट हो गया तो वापस लौटें, लेकिन आप वापसी मूल्यों की उस सूची को दोबारा जांचना चाहेंगे। इसके अलावा आरईवी (एमएसजी_PEEK) में इस्तेमाल किया जाने वाला ध्वज का अर्थ है कि जब भी आप चेक के बाद बाद में देखते हैं तो डेटा अभी भी पढ़ा जा सकता है, इसलिए आपको डेटा के एक बाइट खोने की चिंता करने की आवश्यकता नहीं है।

मुझे विश्वास है कि यह केवल गैर-अवरुद्ध सॉकेट के साथ अच्छी तरह से काम करेगा, क्योंकि यह डेटा प्राप्त होने तक अवरुद्ध हो सकता है। यदि आप ब्लॉकिंग सॉकेट का उपयोग करना चाहते हैं तो आप इसे इस चेक से पहले ioctlsocket के साथ गैर-ब्लॉक सेट करना चाहते हैं, फिर इसे वापस कैसे करें।

+0

सॉकेट को अवरुद्ध करने के लिए आप चयन का उपयोग करेंगे। –

3

एक सॉकेट "खुली" होने से आपको एंड-टू-एंड कनेक्टिविटी के साथ मदद नहीं मिलती है। यह सुनिश्चित करने का एकमात्र तरीका है कि आप दूसरे छोर के साथ संवाद कर सकते हैं, ठीक है, दूसरे छोर के साथ संवाद करना है।

आपके द्वारा डिज़ाइन किए गए किसी भी प्रोटोकॉल में, आपको इस जांच व्यवहार को लागू करने के बारे में सोचना चाहिए। यदि यह आपका प्रोटोकॉल नहीं है, तो कभी-कभी इसे स्नेही तरीके से करने के तरीके होते हैं (उदाहरण के लिए एफ़टीपी एक बहुत छोटी, बेकार फ़ाइल को जांचने के लिए कि क्या एफ़टीपी पोर्ट अभी भी खुले हैं)।

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