2009-03-26 10 views
10

मैं कैसे जांच सकता हूं कि क्लाइंट Cins+ में विंसॉक के माध्यम से डिस्कनेक्ट हो गया है या नहीं?मैं कैसे जांच सकता हूं कि क्लाइंट Cins+ में विंसॉक के माध्यम से डिस्कनेक्ट हो गया है या नहीं?

+0

सर्वर से, आप जानना चाहते हैं कि क्लाइंट सॉकेट अभी भी कनेक्ट है या नहीं? –

+0

क्या आपका मतलब सी ++ या एमएफसी है? – sfossen

+0

'डिस्कनेक्ट' को परिभाषित करें;) दूसरे छोर पर –

उत्तर

11

आप मोड को रोकने में recv फोन और यह रिटर्न 0 बाइट्स के साथ पढ़ा, सॉकेट डिस्कनेक्ट कर दिया गया है, और यह इंतजार बाइट्स प्राप्त किए जाने के लिए है। this पृष्ठ पर चयन से इस FAQ 2.12

उदाहरण में

देखो।

int nRet; 

if((nRet = select(0, &fdread, NULL, NULL, NULL)) == SOCKET_ERROR) 
{ 
    // Error condition 
    // Check WSAGetLastError 
} 

if(nRet > 0) 
{ 
    // select() will return value 1 because i m using only one socket 
    // At this point, it should be checked whether the 
    // socket is part of a set. 

    if(FD_ISSET(s, &fdread)) 
    { 
     // A read event has occurred on socket s 
    } 
} 
+0

लिनक्स सॉकेट के लिए "बीज नेटवर्क प्रोग्रामिंग गाइड" नहीं है? – AntonioCS

+0

बीएसडी सॉकेट, और वे हर जगह उपयोग किया जाता है। –

4

आप केवल यह बता सकते हैं कि डेटा भेजने का प्रयास करके एक टीसीपी सॉकेट 'डिस्कनेक्ट' है या नहीं। ऐसा इसलिए है क्योंकि प्रोटोकॉल का डिज़ाइन ऐसा है कि यह सहकर्मियों के बीच अस्थायी आबादी की अनुमति देना है। इसलिए, यदि आप ए से आर 1 के माध्यम से R2 से R3 से B तक कनेक्ट करते हैं और थोड़ी देर के लिए डेटा भेजते हैं और फिर भेजना बंद कर देते हैं तो आप R2-> R3 (उदाहरण के लिए) अनप्लग कर सकते हैं और न तो ए और बी नोटिस (या देखभाल) देखेंगे। यदि आपने फिर R2-> R4 और R4-> R3 को प्लग किया और फिर ए और बी के बीच डेटा भेजने का प्रयास किया तो चीजें 'बस काम करेंगी' और आप कभी नहीं जान पाएंगे। यदि, हालांकि, आपने डेटा भेजने की कोशिश की, जब R2-> R3 डिस्कनेक्ट हो गया था तो आप (अंत में, सभी टीसीपी स्तर पुनः प्रयास करने के बाद) एक त्रुटि वापस प्राप्त करेंगे।

अब, कुछ ऑपरेटिंग सिस्टम आपको इस तथ्य से सतर्क करने में सक्षम हो सकते हैं कि आपका स्थानीय नेटवर्क एडाप्टर वर्तमान में कनेक्ट नहीं है और आप इसका उपयोग कह सकते हैं "मैं अब अपने साथियों से जुड़ा नहीं हूं" लेकिन मैं ' टी सलाह देते हैं।

यदि आपके साथियों को पता है कि कनेक्शन 'टूटा हुआ' महत्वपूर्ण है तो या तो कभी-कभी सहकर्मियों के बीच डेटा भेजने या टीसीपी को जीवित रखने के लिए एप्लिकेशन स्तर 'पिंग' संदेश का उपयोग करें। व्यक्तिगत तौर पर मैं पिंग संदेश के लिए जाना चाहते हैं ...

संपादित करें: बेशक सभी यह सोचते है कि कि आप को पता है अगर आप अभी भी एक कनेक्शन पर डेटा भेज सकते हैं चाहता हूँ के, सब के बाद, आपको बताया जाता है जब क्लाइंट अब नहीं भेज रहा है क्योंकि आपके रीड 0 बाइट्स लौटाएंगे और जब आप इसकी प्रेषण पक्ष को डिस्कनेक्ट करते हैं तो पता चलेगा क्योंकि आपके लेखन विफल हो जाएंगे; आप यह भी जानते हैं जब आप बंद या तो कनेक्शन के अपने खुद के अंत के भेज सकते हैं या recv पक्ष ...

मुझे लगता है मैं "कट परिभाषित" के प्रारंभिक पेट प्रतिक्रिया प्रतिक्रिया के साथ फंस जाना चाहिए था;)

2

रहे हैं कुछ भिन्न तरीकों, लेकिन सबसे आम एक भेजें का परिणाम की जाँच करें या आदेश प्राप्त करने के लिए है:

nReadBytes = recv(sd, ReadBuffer, BufferSize, 0); 
if (nReadBytes == SOCKET_ERROR) 
{ 
    //error 
} 
nSendBytes = send(sd, WriteBuffer, BufferSize, 0); 
if (nSendBytes == SOCKET_ERROR) 
{ 
    //error 
} 

अधिक उदाहरण (त्रुटि जाँच के साथ पूरा, दोनों क्लाइंट और सर्वर) यहाँ:

http://tangentsoft.net/wskfaq/examples/basics/

0

यदि भेजें() या recv() का परिणाम SOCKET_ERROR है और WSAGetLastError() क्लाइंट डिस्कनेक्ट हो गया है तो WSAECONNRESET लौटाता है।
MSDN से:

WSAECONNRESET सहकर्मी द्वारा

कनेक्शन रीसेट।

रिमोट होस्ट द्वारा एक मौजूदा कनेक्शन जबरन बंद कर दिया गया था।यह सामान्यतः परिणाम देता है यदि रिमोट होस्ट पर सहकर्मी अनुप्रयोग अचानक बंद हो गया है, होस्ट को रिबूट किया गया है, होस्ट या रिमोट नेटवर्क इंटरफ़ेस अक्षम है, या दूरस्थ होस्ट हार्ड क्लोज का उपयोग करता है (SO12LINGER पर अधिक जानकारी के लिए सेटॉकॉप देखें रिमोट सॉकेट पर विकल्प)। यह त्रुटि तब भी हो सकती है जब विफलता का पता लगाने के दौरान एक जीवित टूटी हुई गतिविधि हो, जबकि एक या अधिक ऑपरेशंस प्रगति पर हैं। प्रगति पर चल रहे संचालन WSAENETRESET के साथ विफल हो गए। बाद के ऑपरेशन WSAECONNRESET के साथ विफल हो जाते हैं।

यह गैर अवरोधक सॉकेट के साथ भी काम करता है।

int r = recv(sock, NULL, 0, 0); 
if(r == SOCKET_ERROR && WSAGetLastError() == WSAECONNRESET){ 
    //client has disconnected! 
}