2011-09-30 13 views
14

मैं the documentation on TcpClient.Close() पढ़ रहे हैं और इस पर ध्यान कर रहा हूँ:क्या किसी को नेटवर्कस्ट्रीम और टीसीपी क्लाइंट, या बस टीसीपी क्लाइंट दोनों को बंद करने की आवश्यकता है?

इस विधि कॉलिंग अंततः जुड़े सॉकेट की समाप्ति का परिणाम देगा और यह भी जुड़े NetworkStream कि भेजने के लिए और अगर एक बनाया गया था डेटा प्राप्त करने के लिए किया जाता है बंद हो जाएगा।

तो, मुझे ठीक कर लें मैं गलत हूँ लेकिन यह कहना है कि अगर एक TcpClient पर Close() कॉल NetworkStream भी बंद कर दिया जाएगा।

तो फिर कोड उदाहरण के अंत में क्यों Close() कहा जाता है?

networkStream.Close(); 
tcpClient.Close(); 

यह बस के रूप में ठीक नहीं होगा केवल tcpClient.Close(); कॉल करने के लिए?

+1

हां, यह आवश्यक नहीं है। उस उदाहरण में tcpClient.Close() का उपयोग करना आवश्यक नहीं है, प्रोग्राम उसके ठीक बाद समाप्त हो जाता है :) –

+3

.NET 3.0 से पहले, टीसीपी क्लाइंट और अंतर्निहित नेटवर्कस्ट्रीम दोनों को स्पष्ट रूप से बंद करना था। .NET 3.0 में शुरुआत, टीसीपी क्लाइंट बंद करते समय अंतर्निहित नेटवर्कस्ट्रीम बंद है। टीसीपी क्लाइंट पर बंद() और निपटान() समकक्ष हैं, बंद करें() कुछ आंतरिक लॉगिंग जोड़ते हैं। –

उत्तर

9

इस प्रश्न का उत्तर देने के बाद से किसी और ने ऐसा नहीं किया है कि मैं एक जवाब स्वीकार कर सकता हूं।

हंस के मुताबिक, NetworkStream.Close() को कॉल करना अनावश्यक है क्योंकि TcpClient.Close() इसके अंतर्निहित नेटवर्कस्ट्रीम को बंद कर देता है।

+2

यह उत्तर गलत है। विवियन का जवाब देखें। जैसा कि उल्लेख किया गया है, [गेटस्ट्रीम के लिए डॉक्टर] (http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.getstream.aspx) बताता है कि जब आप के माध्यम से होते हैं तो आपको नेटवर्कस्ट्रीम बंद करना होगा डेटा भेजना और प्राप्त करना। बंद करना TcpClient NetworkStream को जारी नहीं करता है। – BitMask777

+4

हालांकि, [बंद करने के लिए [डॉक्टर] (http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.close.aspx) कॉलिंग कहता है अंततः इस विधि को संबंधित सॉकेट के नजदीक परिणाम मिलेगा और संबंधित नेटवर्कस्ट्रीम को भी बंद कर देगा जिसका उपयोग डेटा बनाने और प्राप्त करने के लिए किया जाता है। 'मुझे संदेह है कि गेटस्ट्रीम दस्तावेज़ पुराना है - वह नोट तब से रहा है। नेट 2.0 (जब यह अभी भी एक मुद्दा था)। – Sam

-6

आप बस क्या करना चाहिए "TcpClient.Close()"
या यदि आप, टाइप करना होगा दोनों

2

NetworkStream और TcpClient IDisposable को लागू। तो मेरी राय में सबसे अच्छा अभ्यास इसे एक प्रयोग ब्लॉक में पैक करना है, इसलिए आपको इसे मैन्युअल रूप से बंद या निपटाने की आवश्यकता नहीं है।

1

क्लाइंट को बंद करना स्ट्रीम को बंद नहीं करता है, यह गेटस्ट्रीम विधि के दस्तावेज़ में है। संदर्भ के लिए, इस चर्चा को देखें: How to properly and completely close/reset a TcpClient connection?

+0

[जैसा सैम यहां लिखता है] (http://stackoverflow.com/questions/7617127/does-one-need-to-close-both-networkstream-and-tcpclient-or-just-tcpclient#comment26031079_7623611), वह नोट है तारीख से बहार। यह आवश्यक था, लेकिन .NET 3.0 के बाद से यह अब नहीं है। – Stijn