2008-10-03 13 views
9

मैं .NET में जीवित रहने की जांच करने का एक तरीका ढूंढ रहा हूं। परिदृश्य यूडीपी और टीसीपी दोनों के लिए है।.NET में जीवित सॉकेट जांच रखने का सबसे अच्छा तरीका क्या है?

वर्तमान में टीसीपी में जो मैं करता हूं वह यह है कि एक तरफ कनेक्ट होता है और जब कोई डेटा नहीं भेजता है तो यह हर एक्स सेकंड में जीवित रहता है।

मैं दूसरी तरफ डेटा की जांच करना चाहता हूं, और यदि कोई ईवेंट या तो बढ़ाने के लिए एक्स सेकंड में गैर प्राप्त नहीं हुआ है।

एक तरीका जिस तरह से मैंने करने की कोशिश की थी वह ब्लॉकिंग प्राप्त करता था और सॉकेट के रेसीवटाइमआउट को एक्स सेकंड में सेट करता था। लेकिन समस्या तब भी हुई जब टाइमआउट हुआ, सॉकेट की रिसीव एक सॉकेट एक्सेप्शन फेंक देगी और इस तरफ सॉकेट बंद हो जाएगा, क्या यह सही व्यवहार है? सॉकेट बंद होने के बजाए टाइमआउट के बाद बंद/मर क्यों जाता है?

डेटा और नींद होने पर एक चेक स्वीकार्य नहीं है (क्योंकि मैं सोने के दौरान डेटा प्राप्त करने पर लापरवाही कर सकता हूं)।

तो इस बारे में जाने का सबसे अच्छा तरीका क्या है, और दूसरी तरफ जिस तरीके से मैंने वर्णन किया है, वह क्यों विफल रहा है?

उत्तर

0

चूंकि आप अवरुद्ध (तुल्यकालिक) प्राप्त नहीं कर सकते हैं, इसलिए आपको एसिंक्रोनस हैंडलिंग के लिए व्यवस्थित करना होगा। सौभाग्य से .NET के साथ करना काफी आसान है। BeginReceive() और EndReceive() के विवरण की तलाश करें। या यह article या this देखें।

टाइमआउट व्यवहार के लिए मुझे इसका कोई निर्णायक विवरण नहीं मिला। चूंकि यह दस्तावेज नहीं है अन्यथा आपको यह मानना ​​है कि यह इच्छित व्यवहार है।

+1

हाँ, अतुल्यकालिक संचालन उल्लेख करना भूल गया है, लेकिन मैं वास्तव में लगता है कि मेरे सवाल है किसी को भी RecieveTimeout साथ अनुभव है और यही कारण है कि यह ऊपर रास्ते में विफल रहता है (कारण तो मेरे कोड और भी आसान RecieveTimeout का उपयोग कर तो होगा। –

1

एमएसडीएन के मुताबिक, सॉकेट एक्सेप्शन फेंक दिया गया है जब रिसीवटाइमआउट कॉल प्राप्त होता है सॉकेट बंद नहीं करेगा। आपके कोड में कुछ और चल रहा है।

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

अपनी समस्याओं के सटीक स्रोत का निदान करने के लिए नेटवर्क ट्रेसिंग को सक्षम करने पर विचार करें: एमएसडीएन पर "नेटवर्क ट्रेसिंग" की तलाश करें (अभी आपको एक लिंक प्रदान नहीं कर सकता है, क्योंकि अभी एमएसडीएन डाउन है)।

+0

दूसरी तरफ सॉकेट को खोले जाने के रूप में अभी भी देखता है (जबकि यह पक्ष नहीं है)। कोड का यह हिस्सा जटिल नहीं है, मैं इसे छोटे परीक्षण मामले में पुन: उत्पन्न करने की कोशिश करूंगा। –

14

यदि आपका शाब्दिक अर्थ है "KeepAlive", तो निम्न का प्रयास करें।

public static void SetTcpKeepAlive(Socket socket, uint keepaliveTime, uint keepaliveInterval) 
    { 
     /* the native structure 
     struct tcp_keepalive { 
     ULONG onoff; 
     ULONG keepalivetime; 
     ULONG keepaliveinterval; 
     }; 
     */ 

     // marshal the equivalent of the native structure into a byte array 
     uint dummy = 0; 
     byte[] inOptionValues = new byte[Marshal.SizeOf(dummy) * 3]; 
     BitConverter.GetBytes((uint)(keepaliveTime)).CopyTo(inOptionValues, 0); 
     BitConverter.GetBytes((uint)keepaliveTime).CopyTo(inOptionValues, Marshal.SizeOf(dummy)); 
     BitConverter.GetBytes((uint)keepaliveInterval).CopyTo(inOptionValues, Marshal.SizeOf(dummy) * 2); 

     // write SIO_VALS to Socket IOControl 
     socket.IOControl(IOControlCode.KeepAliveValues, inOptionValues, null); 
    } 
+2

मुझे आश्चर्य है कि क्या आपने यह भी पढ़ा है प्रश्न :) ofcourse मैं –

+8

नहीं कर रहा हूं यह मेरे लिए मनोरंजक है कि आप किसी ऐसे व्यक्ति को जवाब देंगे जो आपकी मदद करने की कोशिश कर रहा है। –

+1

मूल्य यह स्पष्ट करता है कि यह उत्तर सी # में एकमात्र ऐसा है जो आपको कोड में मैन्युअल रूप से करने के बजाए टीसीपी स्तर के रखरखाव करने की अनुमति देता है (यह सेट-एंड-भूल) है और आपको टाइमआउट चुनने की अनुमति देता है (सॉकेटऑप्शननाम पर बदलना। सेटस्केटऑप्शन का उपयोग करके KeepAlive 2 घंटे का टाइमआउट का उपयोग करता है, अधिकांश अनुप्रयोगों के लिए बहुत लंबा है)। यहां अधिक जानकारी: http://blog.stephencleary.com/2009/05/detection-of-half-open-dropped.html – Derek

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