यह ऐसा करने के बारे में कोई सवाल नहीं है, लेकिन यह सवाल है कि यह गलत है कि मैं क्या कर रहा हूं। मैंने पढ़ा है कि यह पता लगाना संभव नहीं है कि सॉकेट बंद होने पर नियमित रूप से बंद हो गया है (जैसे सर्वर/क्लाइंट प्रक्रिया को मारना, नेटवर्क केबल खींचना) डेटा (BeginReceive) की प्रतीक्षा करते समय, टाइमर या नियमित रूप से भेजे गए संदेशों आदि के बिना। थोड़ी देर के लिए मैं ऐसा करने के लिए निम्न सेटअप का उपयोग कर रहा हूं, और अब तक यह हमेशा पूरी तरह से काम करता है।अप्रत्याशित सॉकेट डिस्कनेक्ट का पता लगाना
public void OnReceive(IAsyncResult result)
{
try
{
var bytesReceived = this.Socket.EndReceive(result);
if (bytesReceived <= 0)
{
// normal disconnect
return;
}
// ...
this.Socket.BeginReceive...;
}
catch // SocketException
{
// abnormal disconnect
}
}
अब, क्योंकि मैंने पढ़ा है कि यह आसानी से संभव नहीं है, मुझे आश्चर्य है कि मेरी विधि में कुछ गड़बड़ है या नहीं। है? या प्रक्रियाओं को मारने और केबलों और इसी तरह खींचने के बीच कोई अंतर है?
विशेष रूप से +1 क्योंकि मुझे यह पसंद है कि "अगर ऐसा करने के लिए प्रोग्राम किया गया है" तो आप इसे कैसे पसंद करते हैं। –
+1 मैं यह भी इंगित करना चाहूंगा कि आपके पास कभी भी कैच स्टेटमेंट नहीं होना चाहिए जो इसे तब तक पकड़ लेता है जब तक कि इसे फिर से फेंकता न जाए। –
@Alex मैं सभी अपवादों को पकड़ने के निषेध से असहमत हूं जब तक आप उन्हें पुनर्स्थापित नहीं करते। मेरे पास एक टीसीपी-सर्वर क्लास है, जो यहां एक जैसा काम करती है और मैं पूरे सर्वर एप्लिकेशन को समाप्त करने के लिए कुछ यादृच्छिक अपवाद नहीं चाहता हूं। यही कारण है कि मैं सभी अपवादों को पकड़ता हूं और उन्हें ऑनएक्सप्शनकॉट इवेंट-हैंडलर में भेजता हूं, जिसे कुछ लॉगिंग कार्यक्षमता आदि से जोड़ा जाना चाहिए। – Algoman