भेजें() का man pageMSG_MORE
ध्वज बताता है जिसे TCP_CORK
जैसा कार्य करने के लिए कहा जाता है। मैं send()
के चारों ओर एक आवरण समारोह है:'MSG_MORE`- फ़्लैग किए गए पैकेट्स के लिए फ्लश कर्नेल का टीसीपी बफर
int SocketConnection_Write(SocketConnection *this, void *buf, int len) {
errno = 0;
int sent = send(this->fd, buf, len, MSG_NOSIGNAL);
if (errno == EPIPE || errno == ENOTCONN) {
throw(exc, &SocketConnection_NotConnectedException);
} else if (errno == ECONNRESET) {
throw(exc, &SocketConnection_ConnectionResetException);
} else if (sent != len) {
throw(exc, &SocketConnection_LengthMismatchException);
}
return sent;
}
मान लिया जाये कि मैं कर्नेल बफर का उपयोग करना चाहते हैं, मैं TCP_CORK
साथ जा सकते हैं, सक्षम जब भी यह आवश्यक है और उसके बाद उसे निष्क्रिय बफर फ्लश करने के लिए। लेकिन दूसरी तरफ, एक अतिरिक्त सिस्टम कॉल की आवश्यकता उत्पन्न होती है। इस प्रकार, MSG_MORE
का उपयोग मेरे लिए अधिक उपयुक्त लगता है। मैं बस के ऊपर भेजने() लाइन को बदल देंगे:
int sent = send(this->fd, buf, len, MSG_NOSIGNAL | MSG_MORE);
lwm.net के अनुसार, पैकेट स्वचालित रूप से प्लावित हो जाएगा वे इतने बड़े हैं कि यदि: एक आवेदन एक पर उस विकल्प सेट
हैं सॉकेट, कर्नेल छोटे पैकेट नहीं भेजेगा। इसके बजाय, यह का इंतजार करेगा जब तक कि पर्याप्त डेटा को अधिकतम आकार के पैकेट को भरने के लिए दिखाया गया हो, फिर उसे भेजें। जब TCP_CORK बंद हो जाता है, तो शेष डेटा तार पर बाहर जाएगा।
लेकिन यह अनुभाग केवल TCP_CORK
को संदर्भित करता है। अब, MSG_MORE
पैकेट फ्लश करने का सही तरीका क्या है?
मैं केवल दो संभावनाएं के बारे में सोच सकते हैं: this पृष्ठ पर वर्णित के रूप में
- कॉल भेजें() एक खाली बफर के साथ और
MSG_MORE
- TCP_CORK विकल्प पुन: लागू स्थापित किया जा रहा बिना
दुर्भाग्य से पूरा विषय बहुत खराब दस्तावेज है और मुझे इंटरनेट पर बहुत कुछ नहीं मिला।
मैं यह भी सोच रहा हूं कि सबकुछ जांचने के लिए कैसे काम करता है? जाहिर है strace
के माध्यम से सर्वर चलाना एक विकल्प नहीं है। तो सबसे आसान तरीका netcat
का उपयोग करना होगा और उसके बाद strace
आउटपुट देखें? या कर्नेल एक लूपबैक इंटरफ़ेस पर अलग-अलग ट्रैफिक को संभालता है?
sendfile() 'MSG_MORE' ध्वज को संरक्षित करता है। Sendfile() रिटर्न जब कैश तब फ्लश किया जाता है। – user206268