/ / SO_SNDBUF और SO_RECVBUF क्या हैं - विंडोज़, सॉकेट, नेटवर्क-प्रोग्रामिंग

SO_SNDBUF और SO_RECVBUF क्या हैं - विंडोज़, सॉकेट, नेटवर्क-प्रोग्रामिंग

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

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

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

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

क्या परिवहन परत के बफ़र्स (उदाहरण के लिए टीसीपी बफर) और इन बफ़र्स के बीच कोई संबंध है?

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

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

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

उत्तर:

उत्तर № 1 के लिए 50

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

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

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

यह सब सबसे अच्छा में वर्णित है यूनिक्स नेटवर्क प्रोग्रामिंग किताब।


उत्तर के लिए 7 № 2

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


जवाब के लिए 3 № 3

"SO_RECVBUF msdn" के लिए Google की खोज ने मुझे ...

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 और SO_SNDBUF

जब एक Windows सॉकेट कार्यान्वयन का समर्थन करता हैSO_RCVBUF और SO_SNDBUF विकल्प, एक एप्लिकेशन विभिन्न बफर आकारों का अनुरोध कर सकता है (बड़ा या छोटा)। Setsockopt को कॉल तब भी सफल हो सकता है जब कार्यान्वयन ने अनुरोध की गई पूरी राशि प्रदान नहीं की। एक आवेदन को जांचने के लिए एक ही विकल्प के साथ getsockopt को कॉल करना होगा बफर आकार वास्तव में प्रदान किया गया।