Saturday, 15 January 2011

c - Prototype of recv() -


टाइपिंग आदमी recv () मेरे सिस्टम पर, मुझे मिलता है:

  ssize_t recv (इंट सॉकेट, शून्य * बफर, आकार_टी लंबाई, इन्ट फ़्लैग); एक ?? | वापसी मूल्य ये कॉल प्राप्त की गई बाइट्स की संख्या, या -1 अगर कोई त्रुटि हुई   

ध्यान दें कि लंबाई अहस्ताक्षरित प्रकार size_t है और फ़ंक्शन का परिणाम एक हस्ताक्षरित ssize_t है। < / P>

यदि SSIZE_MAX से लंबाई के लिए बड़ा मान पारित किया गया है, तो सैद्धांतिक स्थिति क्या है जहां recv () स्मृति को भर देगा बफ़र द्वारा इंगित किया गया है और -1 के अलावा कोई अन्य नकारात्मक मान वापस कर रहा है? क्या ऐसे सॉकेट्स के प्रकार हैं जो बहुत लंबे संदेश (यूनिक्स डोमेन) की अनुमति देते हैं? MSG_WAITALL

के बारे में क्या है पॉज़िक्स 2008 के तर्क के बारे में क्या कहना है Ssize_t (से निकाले गए):

ssize_t
इसका आकार साइज_टी के हस्ताक्षरित एनालॉग के रूप में किया गया है। यह शब्द ऐसा है कि एक कार्यान्वयन या तो लंबी प्रकार का उपयोग करने के लिए चुन सकता है या बस उस आकार के हस्ताक्षरित संस्करण का उपयोग कर सकता है जो आकार_अनुमति रखता है। सभी कार्य जो ssize_t (read () और लिखते हैं) () लिखते हैं कि "कार्यान्वयन-परिभाषित" के रूप में इनपुट का परिणाम {SSIZE_MAX} से अधिक है।

असल में, यह बिल्कुल सच नहीं है, क्योंकि सॉकेट कार्य जो ssize_t , recv सहित होता है, SSIZE_MAX से अधिक इनपुट के बारे में कुछ भी उल्लेख नहीं करता है। इसलिए मैं इसे इरादा के एक बयान के रूप में ले रहा हूं, जिसका अर्थ है कि recv में अनुपलब्ध शब्द एक त्रुटि है जिसे कुछ दिन ठीक किया जा सकता है।

संक्षेप में, यदि आप चाहते हैं पोर्टेबल कोड लिखिए, आपको यह सुनिश्चित करना होगा कि आपके I / O सेगमेंट SSIZE_MAX से अधिक न हों। इसके अलावा, SSIZE_MAX 32767 के रूप में छोटा हो सकता है। इसलिए पोर्टेबल कोड यह नहीं मान लेना चाहिए कि यह अधिक से अधिक हो सकता है।

हालांकि, प्रत्येक व्यक्ति को पोर्टेबिलिटी के बारे में बहुत परवाह नहीं है। आप अपने कोड के कार्यान्वयन के बारे में कुछ जानते हैं। पॉज़िक्स जारी है:

यह पहचाना जाता है कि कुछ कार्यान्वयन के आकार में size_t से छोटे होते हैं एक अनुरूप आवेदन को {SSIZE_MAX} से बड़े टुकड़ों में I / O करने के लिए बाध्य नहीं किया जाएगा, लेकिन एक्सटेंशन का उपयोग करने वाला एक अनुरूप आवेदन पूर्ण सीमा का उपयोग करने में सक्षम होगा यदि कार्यान्वयन एक विस्तारित सीमा प्रदान करता है, जबकि एक एकल प्रकार-संगत इंटरफ़ेस।

पॉज़िक्स गारंटी देता है कि recv द्वारा लौटाए गए केवल मान -1, 0 या प्राप्त बाइट्स की संख्या उपरोक्त शब्दों के अनुसार, संहिता के कार्यान्वयन से SSIZE_MAX से अधिक मूल्यों को मैप किया जा सकता है, लेकिन -1 के अलावा अन्य नकारात्मक integers पर 2 * SSIZE_MAX के बराबर या उससे कम । (यह कैसे पूरा किया जा सकता है रुचि पाठक के लिए एक अभ्यास के रूप में छोड़ दिया है :))। लिनक्स, जहां तक ​​मुझे पता है, किसी भी ऐसे एक्सटेंशन को दस्तावेज नहीं करता है, हालांकि।

No comments:

Post a Comment