2009-05-27 14 views
19

मुझे वास्तव में सॉकेट के बारे में बहुत कुछ नहीं पता है कि उन्हें कैसे पढ़ना और लिखना है जैसे कि वे फाइलें हैं। मैं सॉकेट चयनकर्ताओं का उपयोग करने के बारे में थोड़ा जानता हूँ। मुझे नहीं लगता कि आपको सॉकेट क्यों फेंकना है, वास्तव में वहां क्या हो रहा है? जब तक वे धक्का नहीं देते हैं तब तक बिट्स स्मृति में कहीं बाहर लटकाते हैं? मैंने सॉकेट के बारे में कुछ चीजें ऑनलाइन पढ़ीं, लेकिन यह सब बहुत ही सार और उच्च स्तर है।सॉकेट फ्लश करने का क्या अर्थ है?

वास्तव में यहां क्या हो रहा है?

उत्तर

42

भूमि के ऊपर की एक निश्चित राशि के लिए एक नेटवर्क सॉकेट के लिए लिख और डेटा भेजने में शामिल नहीं है। यदि हर बार बाइट सॉकेट में प्रवेश किया जाता है, तो डेटा वास्तविक डेटा के प्रत्येक बाइट के लिए आप टीसीपी हेडर के 40+ बाइट्स के साथ समाप्त हो जाते हैं। (मान लें कि आप एक टीसीपी सॉकेट का उपयोग कर रहे हैं। अन्य सॉकेट में अलग-अलग मान होंगे)। ऐसी अक्षमता से बचने के लिए, सॉकेट एक स्थानीय बफर को बनाए रखता है, जो आम तौर पर कुछ हद तक 1000 बाइट्स होता है। जब वह बफर भर जाता है, तो डेटा के चारों ओर एक हेडर लपेटा जाता है और पैकेट को अपने गंतव्य पर भेज दिया जाता है।

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

ध्यान दें कि जब आप एक सॉकेट बंद करते हैं, यह स्वचालित रूप से किसी भी आणि बाकी डेटा flushes, तो फ्लश करने के लिए इससे पहले कि आप इसे बंद कोई आवश्यकता नहीं है।

+0

एनएजीएल इस में कैसे जुड़ता है, क्या आप जानते हैं? – rogerdpack

+0

महान उत्तर .... – goh

1

मैंने सॉकेट प्रोग्रामिंग के लिए फ्लश का उपयोग नहीं किया है। मुझे कहीं याद है कि ऐसे तरीके हैं जिन्हें आप सेट कर सकते हैं, जहां धारा उन्मुख भेजे गए छोटे पैकेट की संख्या को कम करने का प्रयास करता है। हालांकि, आप यह सुनिश्चित करने के लिए एक प्रेषक() का उपयोग करेंगे कि बफर में सब कुछ भेजा जाता है। के रूप में आप नीचे spooling रहे

बंद() फ़ंक्शन बहुत उपयोगी है। बेशक आप एक करीबी() कॉल का उपयोग कर सकते हैं यदि आप चारों ओर लटकाना नहीं चाहते हैं।

अधिक जानकारी के लिए Beej's guide पर एक नज़र डालें।

+3

sendall() फ्लश() –

2

नागल का एल्गोरिदम अक्सर सॉकेट पर उपयोग में होता है। संक्षेप में, यह तब तक प्रतीक्षा करता है जब तक भेजने के लिए एक गैर-मामूली मात्रा में डेटा न हो। समस्या ट्रांसमिशन विलंबता और डेटा के एक पैकेट भेजने की ओवरहेड लागत के बीच संतुलन प्राप्त करना है।

बड़े डेटा पेलोड, छोटे बर्बाद बैंडविड्थ क्योंकि हैडर (अधिकतर) तय आकार की है। इसके अलावा इंटरमीडिएट सिस्टम में आम तौर पर पैकेट दर पर अधिक महत्वपूर्ण प्रदर्शन दर होती है, न कि कुल डेटा दर।

+0

जैसा ही है, यह उत्तर वास्तव में यह नहीं बताता है कि सॉकेट संबंधों को कैसे फ़्लश करना है। –

9

आप वास्तव में एक सॉकेट फ्लश नहीं कर सकते हैं।

(How can I force a socket to send the data in its buffer? से)

आप इसे मजबूर नहीं कर सकते हैं। अवधि। टीसीपी अपने दिमाग को बनाता है जब यह डेटा भेज सकता है। अब, सामान्य रूप से जब आप लिखने() TCP सॉकेट पर कॉल,
टीसीपी वास्तव में एक खंड भेज देंगे, लेकिन कोई गारंटी और बल इस के लिए कोई तरीका नहीं है। एक बंद खिड़की और Nagle एल्गोरिथ्म रहे
को दो बातों का ध्यान करने के लिए तुरंत आ: वहाँ कारणों के बहुत सारे कारण है कि टीसीपी एक
खंड नहीं भेजेंगे है।

पूर्ण पोस्ट पढ़ें, यह काफी गहराई से है और मेरे लिए बहुत सी चीजों को स्पष्ट करता है।

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