2009-02-24 15 views
5

मुझे पता है कि इस प्रकार के प्रश्न का एक लंबा इतिहास है, लेकिन जिस तरह से मैं इसका उपयोग कर रहा हूं वह सही 'नेट रास्ता' होना चाहिए और फिर भी यह काम नहीं कर रहा है।सी #/नेट सॉकेट। शटडाउन

मेरे पास एक छोटा सिंक्रोनस आईपी सर्वर डिमन है जो एक साधारण स्वीकार्य सॉकेट करता है, कुछ सामान, socket.send, socket.shutdown, socket.close करें। मेरा ग्राहक एक और छोटा सी # ऐप है जो URLDownloadToFile करता है।

क्या होता है यूआरएल डाउनलोड टॉफाइलफेल (0x800C0008) के साथ विफल रहता है .. सोचता है कि इसका डाउनलोड संसाधन विफल रहा है।

मेरे सर्वर साइड अंत अनुक्रम है:

socket.Shutdown(Both); 
socket.Close(); 

अगर मैं

socket.Disconnect(); 
socket.Close(); 

के लिए इसे बदल (मैं sockopt अभी भी ताजा सच है, समय समाप्ति के साथ ऊपर खोलने के 5 सेकेंड)

इस काम करता है महान।

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

कुल मिलाकर, (और यह सही नहीं हो सकता है) यह करीब की तरह दिखाई देता है .. किसी भी async प्रसंस्करण को मारता है जो शटडाउन() से प्रगति पर हो सकता है।

कोई विचार?

उत्तर

3

Socket.Disconnect

के आधार पर आप पहली बार फोन करने के शटडाउन के बिना डिस्कनेक्ट कॉल करने के लिए की जरूरत है, तो आप गलत पर DontLinger सॉकेट विकल्प सेट और एक अशून्य टाइम-आउट अंतराल निर्दिष्ट कर सकते हैं कि डेटा को सुनिश्चित करने के पंक्तिबद्ध आउटगोइंग ट्रांसमिशन के लिए भेजा गया है। डेटा भेजे जाने तक या निर्दिष्ट टाइम-आउट समाप्त होने तक तब तक ब्लॉक को डिस्कनेक्ट करें। यदि आप डॉटलिंजर को झूठी सेट करते हैं और शून्य टाइम-आउट अंतराल निर्दिष्ट करते हैं, तो कनेक्शन रिलीज़ करता है और स्वचालित रूप से आउटगोइंग कतारबद्ध डेटा को छोड़ देता है।

का सुझाव देता है शटडाउन पर सबसे अच्छा अनावश्यक है ...

+0

बिल्कुल नहीं कॉल करने से पहले अनावश्यक:

socket.Shutdown(SocketShutdown.Both); socket.Disconnect(true); 

बल समापन उपयोग के लिए डिस्कनेक्ट। उद्धृत पाठ कहता है कि डिस्कनेक्ट करने से पहले आपको सेटिंग्स को बदलने की जरूरत है। यदि नहीं, तो यह डेटा को त्याग देगा। – usr

+0

क्या यह मेरा उत्तर इंगित नहीं करता है? यदि आप सेटिंग बदलते हैं (जो ओपी इंगित करता है कि वे करते हैं) यदि आप टाइमआउट व्यवहार से खुश हैं तो आपको शट डाउन की आवश्यकता नहीं है ... – ShuggyCoUk

2

सॉकेट उपयोग पुन: उपयोग के लिए:

socket.Shutdown(SocketShutdown.Both); 
socket.Close(); 
+3

सॉकेट का पुन: उपयोग करने से काम नहीं होता है। फिर से कनेक्ट करने का प्रयास करें, यह एक अवैधऑपरेशन अपवाद फेंक देगा। –

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