स्ट्रीम सॉकेट पर डेटा भेजने के लिए मानक विधि हमेशा लिखने के लिए डेटा के एक हिस्से के साथ भेजने के लिए कॉल किया गया है, यह देखने के लिए वापसी मूल्य की जांच करें कि क्या सभी डेटा भेजा गया था और फिर कॉल को तब तक भेजना जारी रखें जब तक पूरा संदेश स्वीकार नहीं किया जाता ।यह क्यों माना जाता है कि ब्लॉकिंग सॉकेट पर प्रेषित अनुरोधित डेटा से कम के साथ भेज सकता है?
उदाहरण के लिए यह एक आम योजना का एक सरल उदाहरण है:
int send_all(int sock, unsigned char *buffer, int len) { int nsent; while(len > 0) { nsent = send(sock, buffer, len, 0); if(nsent == -1) // error return -1; buffer += nsent; len -= nsent; } return 0; // ok, all data sent }
भी बीएसडी मैनपेज कहा गया है कि
... अगर कोई संदेश अंतरिक्ष सॉकेट पर उपलब्ध है संदेश धारण करने के लिए प्रेषित किया है, तो भेज() सामान्य रूप से ब्लॉक ...
कौन सा मतलब है कि हम यह मान लेना चाहिए कि भेजने सभी डेटा भेजे बिना वापस आ सकते हैं । अब मुझे यह टूटा हुआ है लेकिन यहां तक कि डब्ल्यू। रिचर्ड स्टीवंस इसे अपने मानक संदर्भ पुस्तक में network programming में मानते हैं, शुरुआत अध्यायों में नहीं, लेकिन अधिक उन्नत उदाहरण लिखने के बजाए अपने स्वयं के लेख (सभी डेटा लिखें) फ़ंक्शन का उपयोग करते हैं।
अब मैं इसे अभी भी कम या ज्यादा टूटा हुआ मानता हूं, क्योंकि यदि प्रेषण सभी डेटा संचारित करने में सक्षम नहीं है या अंतर्निहित बफर में डेटा स्वीकार नहीं कर रहा है और सॉकेट अवरुद्ध हो रहा है, तो भेजना चाहिए और पूरे भेजते समय वापस भेजना चाहिए अनुरोध स्वीकार कर लिया गया है।
मेरा मतलब है, ऊपर दिए गए कोड उदाहरण में, यदि डेटा कम डेटा के साथ रिटर्न भेजता है तो यह होगा कि इसे फिर से एक नए अनुरोध के साथ बुलाया जाएगा। आखिरी कॉल के बाद क्या बदल गया है? अधिकतम कुछ सौ CPU चक्र पारित हो गए हैं इसलिए बफर अभी भी भरा हुआ है। अगर अब डेटा स्वीकार करता है तो इसे पहले क्यों स्वीकार नहीं किया जा सकता था?
अन्यथा हम एक अक्षम लूप के साथ समाप्त हो जाएंगे जहां हम एक सॉकेट पर डेटा भेजने की कोशिश कर रहे हैं जो डेटा स्वीकार नहीं कर सकता है और कोशिश कर रहा है, या नहीं?
तो यदि आवश्यक हो तो यह कामकाज की तरह लगता है, परिणामस्वरूप भारी अक्षम कोड होता है और उन परिस्थितियों में सॉकेट को अवरुद्ध करना चाहिए, साथ ही सभी गैर-अवरुद्ध सॉकेटों से बचा जाना चाहिए, इसके बजाय चयन का उपयोग किया जाना चाहिए।
क्या इसका परिणाम ईआईएनटीआर में नहीं होगा? या ईआईएनटीआर केवल तब होगा जब किसी भी डेटा को http://www.manpagez.com/man/2/send/ में वर्णित अनुसार संसाधित किया जाता है और यदि डेटा भेजा गया है, तो ईआईएनटीआर जारी नहीं किया गया है, और इसके बजाय राशि भेजा गया डेटा वापस कर दिया गया है? – Ernelli
ईआईएनटीआर केवल तभी लौटाया जाता है जब कोई डेटा अभी तक स्थानांतरित नहीं किया गया हो (और सिग्नल हैंडलर SA_RESTART ध्वज के साथ स्थापित नहीं किया गया था)। – mark4o
क्या वास्तव में यही कारण है? क्या इसका मतलब यह होगा कि, अगर मैं कोई सिग्नल हैंडलर इंस्टॉल नहीं करता हूं, तो भेजने के चारों ओर लूप अनावश्यक होगा? इससे मेरे लिए चीजों को थोड़ा सा सरल बना दिया जाएगा। दुर्भाग्यवश, इस मामले पर दस्तावेज बहुत दुर्लभ प्रतीत होता है ... – lxgr