2010-03-28 11 views
5

हम एक टीसीपीएस सर्वर और ग्राहक कार्यक्रम लिख रहे हैं। टीसीपी क्लाइंट बफर में कितनी जगह है? पसंद है, किस बिंदु पर यह डेटा फेंकना शुरू कर देगा? हम यह निर्धारित करने की कोशिश कर रहे हैं कि टीसीपी क्लाइंट अवरुद्ध हो सकता है या यदि इसे अपने स्वयं के पृष्ठभूमि धागे में जाना चाहिए (ताकि बफर पूर्ण नहीं हो सके) ..नेटवर्कस्ट्रीम और टीसीपी क्लाइंट के पास कितना बफर है?

उत्तर

6

आप TcpClient.ReceiveBufferSize और TcpClient.SendBufferSize से बफर आकार प्राप्त कर सकते हैं।

उपलब्ध बफर आकार भिन्न होंगे क्योंकि टीसीपी स्तर पर डेटा प्राप्त/स्वीकृत (या नहीं) प्राप्त होता है। टीसीपी क्लाइंट डिफ़ॉल्ट रूप से अवरुद्ध है।

कोई डेटा पूर्ण बफ़र्स का एक परिणाम के रूप में दूर फेंक दिया जाएगा, हालांकि डेटा के तहत त्रुटि की स्थिति में दूर (जैसे साथियों के गायब हो जाता है/दुर्घटनाओं/बाहर निकलता है आदि)

+0

वैसे तो यह तब तक डेटा प्राप्त करेगा जब तक कि कंप्यूटर स्मृति से बाहर नहीं हो जाता? – Earlz

+3

नहीं, टीसीपी प्रवाह नियंत्रण प्रदान करता है। जब बफर भर जाते हैं, तो दूसरा अंत भेजना बंद कर देता है। – nos

+0

मैं भी सर्वर का प्रभारी हूं, इसलिए यदि ऐसा होता है, तो सर्वर पर क्या होता है? 'टीसीपी सर्वर' – Earlz

3

MSDN प्रलेखीकरण डिफ़ॉल्ट कहते फेंक किया जा सकता है send और receiveTcpClient के लिए बफर 8192 बाइट्स, या 8 के आकार का आकार है। दस्तावेज इस सीमा को निर्दिष्ट नहीं करता है कि ये बफर कितने बड़े हो सकते हैं।

जैसा कि मुझे यकीन है कि आप जानते हैं, आप इसके अंतर्निहित NetworkStream ऑब्जेक्ट का उपयोग करके TcpClient के माध्यम से डेटा भेज और प्राप्त करते हैं। आप इस पर नियंत्रण में हैं कि ये सिंक्रोनस या असिंक्रोनस ऑपरेशंस हैं या नहीं। यदि आप तुल्यकालिक व्यवहार चाहते हैं, तो Read और NetworkStream के तरीकों का उपयोग करें। यदि आप असीमित व्यवहार चाहते हैं, तो BeginRead/EndRead और BeginWrite/EndWrite संचालन का उपयोग करें।

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

+0

ठीक है हम नहीं हैं सुनिश्चित करें कि हम एसिंक्रोनस चाहते हैं, या पृष्ठभूमि थ्रेड – Earlz

+0

@Earlz में सिंक्रनाइज़ करने के लिए, मुझे यकीन नहीं है कि दोनों के बीच एक बड़ा अंतर है। एसिंक्रोनस विधियां, उदाहरण के लिए, 'BeginRead(), एक अलग थ्रेड पर अपने संबंधित' AsyncCallback' विधियों को निष्पादित करें। दिन के अंत में, यदि आप यूआई से उपयोगकर्ता इनपुट को प्रोसेस करते समय डेटा भेजने/प्राप्त करने का प्रयास कर रहे हैं तो आपको द्वितीयक थ्रेड का उपयोग करने की आवश्यकता है। –

+1

@ मैटडाविस, यह एक आम गलतफहमी है। .Net Async I/O विधियां वास्तव में एक ऑपरेटिंग सिस्टम सुविधा कॉल I/O प्राप्ति बंदरगाहों का लाभ उठाती हैं, इसलिए सॉकेट में या फ़ाइल सिस्टम से या फ़ाइल नाम से या किसी नामित पाइप या I/O की प्रतीक्षा करते समय उपयोग में कोई थ्रेड अवरुद्ध नहीं होता है या उपयोग में नहीं होता है। जो कुछ। –

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