मैंने कम से कम 10 बार प्रलेखन पढ़ा है और कुछ 10 या तो कोड स्निपेट और पूर्ण प्रोग्राम भी पढ़े हैं जहां डेटा भेजने के लिए गैर-अवरुद्ध सॉकेट का उपयोग किया जाता है। समस्या यह है कि कुछ ट्यूटोरियल या तो शुरुआती (बीजेस एफआईआई) के लिए हैं या उनकी धारणाओं में बहुत खराब हैं; और जो जटिल नहीं हैं वे विशेष कोड उदाहरण हैं जो यह नहीं बताते कि वे ऐसा क्यों करते हैं जो वे करते हैं। यहां तक कि एसओ ज्ञान आधार भी मेरी राय में send
व्यवहार के पूरे मैदान को पूरी तरह से कवर नहीं करता है। f.e पर विवरण क्या मैं के बाद कर रहा हूँ कर रहे हैं:क्या कोई मुझे गैर-अवरुद्ध सॉकेट के लिए 'प्रेषण' व्यवहार का अच्छा स्पष्टीकरण दे सकता है?
- क्या वापस 0 से संकेत मिलता है कि वास्तव में के कोड होता है, और यह
errno
तो जाँच या एक बस आगे की जांच पड़ताल के बिना कनेक्शन त्यागने चाहिए लायक है? - एक नकारात्मक वापसी मान वारंट एक कनेक्शन बुरा चला बंद करने के लिए हो रही है, या यह केवल इसलिए जब तक
errno
EWOULDBLOCK
,EAGAIN
याEINTR
(... अन्य) है? - क्या वापसी मूल्य
errno
है जब वापसी मूल्य> 0
है? जाहिर है, मान "भेजा गया" डेटा उद्धृत करता है (उद्धरणों में क्योंकि यह वास्तव में एक लंबी प्रक्रिया है, सही है), लेकिन चूंकि सॉकेट गैर-अवरुद्ध है, इसका मतलब यह है कि कोई भी तुरंत एक और कॉल जारी कर सकता है, याerrno
पर निर्भर करता है , किसी को अगले प्रेषण अवसर (चयन/मतदान/एपोल का उपयोग करके) का इंतजार करना चाहिए? - असल में, क्या कोई पहले वापसी मूल्य की जांच करता है और केवल तभी
errno
मूल्य? या शायदsend
प्रत्येक कॉल परerrno
सेट करता है, भले ही मूल्य वापसी? इससे त्रुटि कुछ आसान हो जाएगी ... - यदि कोई
EINTR
प्राप्त करता है, तो प्रोग्राम के लिए एक अच्छा, मजबूत व्यवहार क्या होगा? बस राज्य को रिकॉर्ड करें और अगले प्रेषण अवसर पर पुनः प्रयास करें, जैसेEWOULDBLOCK
औरEAGAIN
? - क्या कोई दोनों
EWOULDBLOCK
औरEAGAIN
पर जांच करता है? क्या हम दोनों एक ही मूल्य रखने पर भरोसा कर सकते हैं, या यह कार्यान्वयन पर निर्भर करता है? - क्या
send
धारा सॉकेट के लिएEMSGSIZE
लौटाता है? यदि ऐसा नहीं होता है, तो कोई बफर आकार बहुत बड़ा नहीं है, है ना? - क्या मूल्य वापस ज्ञात त्रुटि कोड के बराबर हो सकता है?
यदि आप मजबूत गैर-अवरुद्ध प्रेषण कोड का उदाहरण प्रदान कर सकते हैं, तो इसकी पूरी सराहना की जाएगी।
भेजें (2) शून्य लौटाए जाने पर शून्य वापस कर सकते हैं 0। यूडीपी जैसे डाटाग्राम प्रोटोकॉल के लिए, इसका परिणाम शून्य-बाइट पैकेट भेजा जा सकता है। इसके अलावा, सफल लाइब्रेरी कॉल में इरनो को अपरिवर्तित होने की गारंटी नहीं है। – Anomie
@Anomie: पहला भाग पर्याप्त है, लेकिन दूसरे के लिए, POSIX गारंटी देता है कि कुछ लाइब्रेरी कॉल त्रुटियों को संशोधित नहीं करेंगे अगर कोई त्रुटि नहीं है, और 'प्रेषण' उन कॉलों में से एक है। –
आप इसे कहां देखते हैं? POSIX.1-2008 ऑनलाइन है [यहां] (http://pubs.opengroup.org/onlinepubs/9699919799/)। [Errno पर पृष्ठ] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/errno.html) कहता है "फ़ंक्शन में सफल कॉल के बाद इरनो की सेटिंग अनिर्दिष्ट है जब तक कि उस फ़ंक्शन का विवरण निर्दिष्ट नहीं करता है errno संशोधित नहीं किया जाएगा ", और [भेजने के लिए पृष्ठ] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/send.html) ऐसी कोई बात नहीं प्रतीत होता है। – Anomie