2013-03-20 3 views
8

शुरुआती सवाल फिर से: एक सवाल मैं बहुत पहले नहीं पूछा के पालन अप तरह।सॉकेट कब होता है। रिसीव डेटा वापस कर देता है?

मैं इस तुल्यकालिक सॉकेट ट्यूटोरियल http://msdn.microsoft.com/en-us/library/6y0e13d3.aspx, नीचे दिए गए कोड में विशेष रूप से एक ही लाइन समझने की कोशिश कर रहा हूँ।

प्रश्न: मैं यह सुनिश्चित करना चाहता हूं कि मैं प्रोग्राम प्रवाह को सही समझ रहा हूं। जब handler.Receive (बाइट) वापसी करता है? इसे वापस और पूर्णांक में प्राप्त बाइट की संख्या संग्रहीत करती है bytesRec ** जब यह "अतिप्रवाह" और 1024bytes की तुलना में अधिक प्राप्त हुआ है? ** और अगर कि इतने है, और यह मूर्खतापूर्ण ध्वनि सकता है, तो क्या होता है और अधिक बाइट्स आने के रूप में यह * डेटा * चर में 1024 बाइट्स भंडारण किया जाता है और अधिक बाइट्स है कि उस समय पर पहुंचने से किया जा सकता है के लिए नहीं सुन रहा? या मुझे इसके बारे में चिंता नहीं करनी चाहिए और नेट की देखभाल करना चाहिए?

Socket handler = listener.Accept(); 
data = null; 

// An incoming connection needs to be processed. 
while (true) { 
    bytes = new byte[1024]; 
    int bytesRec = handler.Receive(bytes); 
    // My question is WHEN does the following line 
    // get to be executed 
    data += Encoding.ASCII.GetString(bytes,0,bytesRec); 
    if (data.IndexOf("<EOF>") > -1) { 
     break; 
    } 
} 

उत्तर

10

जब handler.Receive (बाइट) वापसी करता है?

प्रलेखन:

तो कोई डेटा पढ़ने के लिए उपलब्ध है, को अवरुद्ध कर देगा जब तक डेटा उपलब्ध है, जब तक कि एक टाइम-आउट मूल्य Socket.ReceiveTimeout का उपयोग करके स्थापित किया गया था विधि प्राप्त करें। यदि टाइम-आउट मान पार हो गया था, तो कॉल प्राप्त करें SocketException फेंक देगा। आप गैर अवरुद्ध मोड, में हैं और वहाँ प्रोटोकॉल स्टैक बफर में कोई डेटा में उपलब्ध है, तो विधि तुरंत पूरा करने और फेंक होगा एक SocketException प्राप्त करें। डेटा पढ़ने के लिए उपलब्ध है या नहीं, यह निर्धारित करने के लिए आप उपलब्ध संपत्ति का उपयोग कर सकते हैं। जब उपलब्ध गैर-शून्य होता है, तो को ऑपरेशन प्राप्त करें।


इसे वापस और पूर्णांक bytesRec में प्राप्त जब यह "अतिप्रवाह" और 1024 से अधिक बाइट्स प्राप्त हुआ है बाइट की संख्या की दुकान करता है?

नहीं, यह हमेशा पढ़ने वाले बाइट्स की संख्या देता है। यदि ऐसा नहीं होता है, तो आप कैसे जान सकते हैं कि bytes का कौन सा हिस्सा सार्थक डेटा है और इसका किस हिस्से का उपयोग नहीं किया गया है?

यह बहुत महत्वपूर्ण को समझने के लिए सॉकेट आम तौर पर काम करते हैं: बाइट्स पैकेट में पहुंचने जा सकता है, लेकिन जहां तक ​​रिसीवर संबंध है प्रत्येक बाइट स्वतंत्र रूप से माना जाना चाहिए। इसका मतलब यह है कि इस बात की कोई गारंटी नहीं है कि प्रेषक ने उन्हें भेजे गए हिस्सों में बाइट प्राप्त करेंगे, और निश्चित रूप से कोई गारंटी नहीं है कि आपके बफर को भरने के लिए पर्याप्त डेटा है।

यदि आप केवल 1024-बाइट हिस्सों में आने वाले डेटा को संसाधित करना चाहते हैं, तो Receive पर कॉल करना जारी रखने की अपनी ज़िम्मेदारी है जब तक कि यह आपके कुल में 1024 बाइट जारी नहीं हो जाती।

और अगर है कि इतनी है, और यह मूर्खतापूर्ण ध्वनि सकता है, और अधिक बाइट्स क्या आने अगर ऐसा होता के रूप में यह चर में 1024 बाइट्स भंडारण किया जाता है और अधिक बाइट्स है कि उस समय पर पहुंचने से किया जा सकता है के लिए नहीं सुन रहा?

चलिए दोहराते हैं कि Receive बफर में 1024 बाइट्स स्टोर नहीं करेगा क्योंकि यह बफर का आकार है। यह 1024 बाइट्स तक स्टोर करेगा।

यदि आपके बफर की तुलना में नेटवर्क स्टैक द्वारा आंतरिक रूप से अधिक डेटा buffered किया गया है तो 1024 बाइट्स आपको वापस दिया जाएगा और शेष नेटवर्क स्टैक के बफर में तब तक रहेगा जब तक आप Receive पर कॉल न करें। यदि Receive ने डेटा को आपके बफर में कॉपी करना शुरू कर दिया है और उस समय नेटवर्क से अधिक डेटा प्राप्त होता है तो संभवतः क्या होने जा रहा है यह है कि उन्हें अगले Receive कॉल का इंतजार करना होगा।

सब के बाद, कोई बिंदु पर किसी को भी एक गारंटी नहीं है कि Receive आप सभी डेटा यह कर सकते हैं देना होगा प्रदान की थी (हालांकि और पाठ्यक्रम वांछनीय है कि की यह क्या समय के सबसे अधिक होता है)।

+0

आप सोच सकते हैं कि फ़ाइल से पढ़ने की तरह बहुत कुछ प्राप्त करें। यदि फ़ाइल में अभी भी डेटा के पर्याप्त बाइट हैं (इस मामले में नेटवर्क स्टैक), तो यह आपके बफर के आकार को शीर्ष पर वापस कर देगा, अन्यथा यह शेष डेटा लौटाएगा (जो आपके बफर आकार से कम हो सकता है) । – shellster

+0

@shellster: की तरह। लेकिन वह विवरण बहुत महत्वपूर्ण तथ्य पर चमकता है कि नेटवर्क स्टैक आपको डेटा चुनने का निर्णय ले सकता है जो इसे * चुनता है *। कोई गारंटी नहीं है। – Jon

+1

@ जोन एक शानदार उत्तर के लिए धन्यवाद। जब आप कहते हैं, "नेटवर्क स्टैक आपके द्वारा चुने गए किसी भी हिस्से में डेटा को सौंपने का निर्णय ले सकता है" क्या इसका मतलब यह है कि मेरा ग्राहक भेज सकता है "क्षमा करें प्रिय, मैं अकेला नहीं हूं लेकिन विवाहित हूं" लेकिन मेरा सर्वर पहले "विवाहित" हो सकता है "माफ़ करना, प्रिय"? उपरोक्त माइक्रोसॉफ्ट कोड में ऐसी कोई त्रुटि जांच नहीं होती है ... टीसीपी/आईपी इसकी देखभाल नहीं करेगा इसलिए मुझे सही क्रम में डेटा प्राप्त होता है –

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