2010-07-07 9 views
5

के साथ एक वैध टीसीपी पैकेट प्राप्त होता है तो टीसीपी सॉकेट प्रोग्रामिंग में, recv() 0 देता है, तो यह संकेत मिलता है कि दूसरी तरफ इसके कनेक्शन को बंद कर दिया गया है। हालांकि, AFAIK, टीसीपी आरएफसी टीसीपी के पेलोड जनादेश नहीं है> 0. होने के लिए तो, सैद्धांतिक रूप से, एक टीसीपी ढेर संदेश पेलोड के साथ प्राप्त कर सकते हैं 0.क्या मूल्य rev() वापस लौटाएगा यदि उसे पेलोड आकार 0

तो, अनिवार्य रूप से मेरे सवाल है क्या होगा अगर recv() रिटर्न यह पेलोड आकार 0 का एक पैकेट प्राप्त करता है? यदि यह 0 लौटाता है, तो हम इसे बंद कनेक्शन संकेत से कैसे अलग करते हैं।

उत्तर

11

0 के पेलोड आकार के साथ टीसीपी सेगमेंट सर्वव्यापी हैं - वे हर वास्तविक दुनिया टीसीपी स्ट्रीम में काफी अधिक होते हैं। जब भी एक पक्ष दूसरे से डेटा प्राप्त करने की इच्छा रखता है, तो उन्हें भेजा जाता है, लेकिन इसका कोई डेटा नहीं है। (इन्हें आमतौर पर "एसीके पैकेट" के रूप में जाना जाता है, लेकिन एक "एसीके पैकेट" केवल एक नियमित खंड होता है जिसमें कोई डेटा नहीं होता है)।

चूंकि ऐसे पैकेट में उपयोगकर्ता एप्लिकेशन को वितरित करने के लिए कोई डेटा नहीं है, इसलिए recv() वापस आने के लिए recv() कुछ वास्तविक डेटा आने तक अवरुद्ध रहेगा। यदि recv() 0 देता है, तो यह एक निश्चित संकेत है कि दूसरे छोर ने कनेक्शन के अपने पक्ष को बंद कर दिया है और कोई और डेटा नहीं भेज रहा है।

याद रखें कि टीसीपी धारा उन्मुख है: वहाँ है नहीं एक भी टीसीपी सेगमेंट में डेटा किसी एकल recv() कॉल द्वारा लौटाए गए और डेटा के बीच 1 से 1 मानचित्रण। एक recv() कॉल डेटा के एक ब्लॉक को वापस कर सकता है जो कई टीसीपी सेगमेंट को ओवरलैप करता है, और एक ही टीसीपी सेगमेंट में डेटा कई recv() कॉल में वापस किया जा सकता है। टीसीपी सेगमेंट एपीआई का उपयोग कर टीसीपी सेगमेंट के बीच की सीमाएं एप्लिकेशन को दिखाई नहीं देती हैं। यदि आप ऐसी सीमाएं चाहते हैं, तो आपको टीसीपी स्ट्रीम के भीतर एक एप्लिकेशन-लेयर प्रोटोकॉल का उपयोग करके स्वयं को कार्यान्वित करने की आवश्यकता है, या यूडीपी जैसे डेटाग्राम-उन्मुख प्रोटोकॉल का उपयोग करना होगा। एसीके का उल्लेख करने के लिए

+0

+1। –

+0

एसीके पैकेट में एक एसीके ध्वज सेट होगा। – AlastairG

+1

@AlastairG: ठीक है, लेकिन शुरुआती 'SYN' या कनेक्शन रीसेट के अलावा प्रत्येक पैकेट में' ACK' बिट सेट है। – caf

3

सही, POSIX के अनुसार recv0 देता है, तो कनेक्शन सहकर्मी द्वारा सही ढंग से बंद हो जाता है।

किसी एक शून्य आकार पेलोड के साथ एक टीसीपी पैकेट भेजने के लिए सफल रही है, तो ओएस प्रक्रिया है कि सॉकेट पर recv सिस्टम कॉल पर अवरुद्ध किया जा रहा करने के लिए किसी भी डेटा वापस जाने के लिए नहीं है।

याद रखें कि टीसीपी पेलोड एक निरंतर धारा बनाते हैं जिसे ओएस द्वारा यादृच्छिक रूप से काटा जा सकता है, न कि एक सिस्टम कॉल के दौरान वापस आने वाले डेटाग्राम का अनुक्रम।

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