2010-11-23 7 views
21

तुम मुझे व्याख्या कर सकते हैं कर रहे हैं वास्तव में क्या SO_SNDBUF और SO_RECVBUF विकल्प क्या हैं?क्या SO_SNDBUF और SO_RECVBUF

ठीक है, किसी कारण के लिए ओएस निवर्तमान/incomming डेटा बफ़र्स लेकिन मैं इस विषय को स्पष्ट करना चाहते हैं।

उनकी भूमिका (आमतौर पर) क्या है?

क्या वे प्रति-सॉकेट बफर हैं?

वहाँ परिवहन परत के बफर (टीसीपी बफर, उदाहरण के लिए) और इन बफ़र्स के बीच एक कनेक्शन है?

जब धारा सॉकेट (टीसीपी) का उपयोग करते हुए और जब संयोजन सॉकेट (यूडीपी) का उपयोग करते हुए वे एक अलग व्यवहार/भूमिका है?

एक अच्छा लेख भी बहुत अच्छा होगा।

मैंने इसे गुगल किया लेकिन कोई उपयोगी जानकारी नहीं मिली।

उत्तर

3

"SO_RECVBUF MSDN" के लिए गूगल सर्च कर रहे हैं मुझे दिया ...

http://msdn.microsoft.com/en-us/library/ms740476(VS.85).aspx

जो उत्तर देता है अपने विकल्पों को तालिका में इन लाइनों के साथ "वे सॉकेट प्रति कर रहे हैं":

SO_RCVBUF int Specifies the total per-socket buffer space reserved for receives. 
SO_SNDBUF int Specifies the total per-socket buffer space reserved for sends. 

के साथ और अधिक विस्तार बाद में:

SO_RCVBUF and SO_SNDBUF 
When a Windows Sockets implementation supports the SO_RCVBUF and SO_SNDBUF options, an application can request different buffer sizes (larger or smaller). The call to setsockopt can succeed even when the implementation did not provide the whole amount requested. An application must call getsockopt with the same option to check the buffer size actually provided. 
49

"SO_" उपसर्ग "के लिए है सॉकेट विकल्प ", हां, ये प्रति-सॉकेट बफर के लिए प्रति-सॉकेट सेटिंग्स हैं। आमतौर पर सिस्टम-व्यापी डिफ़ॉल्ट और अधिकतम मान होते हैं।

SO_RCVBUF समझने में आसान है: यह उस बफर का आकार है जो कर्नेल आवंटित सॉकेट में आने वाले डेटा को नेटवर्क पर आने के दौरान आवंटित करता है और जब यह इस सॉकेट का मालिक है । टीसीपी के साथ, यदि डेटा आता है और आप इसे पढ़ नहीं रहे हैं, तो बफर भर जाएगा, और प्रेषक को धीमा करने के लिए कहा जाएगा (टीसीपी विंडो समायोजन तंत्र का उपयोग करके)। यूडीपी के लिए, बफर भरने के बाद, नए पैकेट को त्याग दिया जाएगा।

SO_SNDBUF, मुझे लगता है, केवल टीसीपी के लिए मायने रखती है (यूडीपी, जो कुछ भी आप भेजने सीधे नेटवर्क से बाहर चला जाता है में)। टीसीपी के लिए, यदि आप रिमोट साइड पढ़ नहीं रहे हैं तो आप बफर भर सकते हैं (ताकि रिमोट बफर पूर्ण हो जाए, तो टीसीपी इस तथ्य को आपके कर्नेल में संचारित करता है, और आपका कर्नेल डेटा भेजना बंद कर देता है, इसके बजाय इसे स्थानीय बफर में जमा कर देता है भर जाना)। या नेटवर्क समस्या होने पर यह भर सकता है, और कर्नेल को भेजे गए डेटा के लिए पावती नहीं मिल रही है। तब तक नेटवर्क पर डेटा भेजना धीमा हो जाएगा, अंत में, आउटगोइंग बफर भर जाता है। यदि हां, तो भविष्य में write() एप्लिकेशन द्वारा इस सॉकेट को कॉल कर देगा (या EAGAIN लौटाएं यदि आपने O_NONBLOCK विकल्प सेट किया है)।

यह सब करना सबसे अच्छा है Unix Network Programming पुस्तक में वर्णित।

7

विंडोज़ में, प्रेषण बफर का यूडीपी में प्रभाव पड़ता है। यदि आप नेटवर्क से तेज़ी से पैकेट को विस्फोट कर सकते हैं तो उन्हें प्रेषित कर सकते हैं, अंत में आप सॉकेट आउटपुट बफर भर देंगे और SendTo "ब्लॉक" के साथ असफल हो जाएगा। SO_SNDBUF बढ़ाना इससे मदद करेगा। मुझे एक परीक्षण के लिए भेजना और बफर प्राप्त करना था, जो मैं एक विंडोज बॉक्स और लिनक्स बॉक्स के बीच भेज सकने वाली अधिकतम पैकेट दर खोजने के लिए कर रहा था।मैं "ब्लॉक ब्लॉक" त्रुटि कोड, थोड़ा सो रहा है, और पुनः प्रयास करने का पता लगाकर भेजने के आकार को भी संभाला होगा। लेकिन प्रेषण बफर आकार को पंप करना आसान था। विंडोज़ में डिफ़ॉल्ट 8K है, जो पीसी के इस युग में जीबी की रैम के साथ अनावश्यक रूप से छोटा लगता है!

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