2011-08-23 16 views
9

पर भेजने से कैसे रोकें I पुस्तकालयों (.NET) में कुछ अजीब व्यवहार को अलग करने की कोशिश कर रहे कुछ परीक्षण कर रहे हैं। जब मैं सी ++ के माध्यम से विंसॉक एपीआई का उपयोग करता हूं और बस कॉल करता हूं, तो बंद करें(), मैं विंडोज़ पक्ष को एफआईएन/एसीके पैकेट भेजता हूं और रिमोट साइड एक एसीके पैकेट वापस भेजता है। यही वह है जिसे मैं एक करीबी करीबी कहूंगा। हालांकि, जब मैं सी # में प्रोग्रामिंग देख रहा हूं तो मैं देख रहा हूं कि मैं एक सुंदर बंद कहूंगा।एनईटी पुस्तकालयों को आरएसटी पैकेट को

सी # में, मैं अपने सॉकेट खोलें और फिर, जब यह बंद करने, मैं देख खिड़कियों एक फिन पैकेट केवल जब पहली Socket.Shutdown बुला() भेजें। हालांकि, जब भी मैं Socket.Close() को C# में कॉल करता हूं, एक आरएसटी पैकेट भेजा जाता है और कनेक्शन संक्षेप में गिरा दिया जाता है। यह मुझे भ्रमित करता है क्योंकि, मैंने जो लाइन पढ़ी है, उससे टीसीपी समापन प्रक्रिया एफआईएन/एसीके -> एसीके (दोनों पक्षों से वास्तव में लेकिन अभी के लिए, मैं केवल "मेरी" पक्ष से चिंतित हूं); यानी मिश्रण में एक आरएसटी पैकेट नहीं होना चाहिए। जो मैंने पढ़ा है, जाहिर है, एक आरएसटी पैकेट केवल तभी भेजा जाता है जब रिसीवर कनेक्शन स्थिति के बारे में अनिश्चित है और बाहर निकलना चाहता है।

यह आरएसटी पैकेट .NET में नियोजित शटडाउन पर क्यों भेजा जा रहा है और विंसॉक एपीआई से नियोजित शटडाउन में बिल्कुल नहीं? .NET से एक सुंदर शटडाउन के दौरान एक आरएसटी पैकेट के संचरण को रोकने के लिए कोई तरीका है?

यदि यह महत्वपूर्ण है, तो कोड कोड दोनों में, मैं संबंधित बंद() विधि को कॉल करने से पहले सॉकेट पर सभी उपलब्ध डेटा पढ़ रहा हूं।

उत्तर

0

हाल ही में एक समान समस्या को मारा जहां एक एप्लिकेशन पीओपी 3 को एक्सचेंज सर्वर से बात कर रहा था। जब .NET प्रोग्राम समाप्त हो गया, तो यह अनजाने में बंद हो गया, और एक्सचेंज ने पीओपी 3 वार्तालाप को "निरस्त" के रूप में माना और इसे वापस घुमाया।

इसका कारण यह है कि मुझे लगता है कि टीसीपी आरएसटी एक "एक तरफा" संदेश है - आपको जवाब के लिए इंतजार नहीं करना है।

Thread.Sleep(5000); 

यह पॉप 3 समस्या कि मैंने पहले बताया के लिए काम किया: तो जो .NET क्या भेजता है (। या शायद किसी भी कार्यक्रम के बाद यह समाप्त हो जाता है) एक संभव समाधान सॉकेट बंद करने के बाद और कार्यक्रम छोड़ने से पहले थोड़ा इंतजार करना है ; प्रतीक्षा समय ने कनेक्शन को बंद करने का कारण बना दिया, और एक्सचेंज ने सत्र को निरस्त नहीं किया।

+1

यह दिलचस्प है। मुझे देखना होगा कि जब मैं नींद को लागू करता हूं तो क्या होता है। मुझे आश्चर्य है कि और क्या दिखाया जाएगा क्योंकि मुझे नहीं लगता कि यह पूर्ण संदर्भ के लिए व्यवहार्य है (यदि यह काम करता है) जिसमें यह हो रहा है। मैंने व्यवहार को अलग करने के लिए कंकाल कार्यक्रम किए हैं। वैसे भी धन्यवाद क्योंकि मैंने यहां नींद की कॉल का उपयोग करने के बारे में सोचा नहीं था। –

3

पढ़ना Socket.Close की नेट डॉक, यह मैं क्या मिला है:

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

जो वास्तव में समझ में आता है। अगर अभी बफर (ओएस एक) में डेटा है और आप कनेक्शन फाड़ या प्रक्रिया कनेक्शन रीसेट किया जाएगा (टीसीपी चश्मा में अधिक विस्तृत जानकारी) मार डालते हैं।

जब आरएसटी भेजा जाता है तो TCP Guide देखें।

मेरा अनुमान है कि अभी भी कुछ अनसेट या ट्रांजिट डेटा में या आउटगोइंग/इनकमिंग बफर में आरएसटी ट्रिगर होता है।

1

निम्नलिखित कोड आरएसटी पैकेट को रोक सकता है। ऐसा इसलिए है क्योंकि एक एफआईएन पैकेट भेजने के 60 मिनट बाद प्रतीक्षा करें।

socket.Close(60); 

बंद विधि विवरण here है।

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