तो, आपके सवाल का जवाब आप अपने परिवहन के रूप में TCP या UDP का उपयोग कर रहे हैं, इस पर एक निष्पक्ष बिट निर्भर करता है।
यूडीपी के लिए, जीवन बहुत आसान हो जाता है, जिसमें आप अपने इच्छित पैकेट आकार के साथ आरईवी/रिकवर्म/रिकव्सग को कॉल कर सकते हैं (आप संभवतः स्रोत से निश्चित लंबाई वाले पैकेट भेज सकते हैं), और यह धारणा करें कि यदि डेटा उपलब्ध है, तो यह पैकेट-लंबाई आकार के गुणकों में है। (आईई आप अपने भेजने वाले साइड पैकेट के आकार के साथ आरईवी * कहते हैं, और आप सेट हैं।)
टीसीपी के लिए, जीवन थोड़ा और दिलचस्प हो जाता है - इस स्पष्टीकरण के उद्देश्य के लिए, मुझे लगता है कि आप पहले से ही जानते हैं सॉकेट(), बाइंड(), सुनो() और स्वीकार() को कैसे उपयोग करें - बाद में यह है कि आप अपने नव निर्मित कनेक्शन के फ़ाइल डिस्क्रिप्टर (एफडी) कैसे प्राप्त करते हैं।
सॉकेट - अवरुद्ध करने के लिए I/O करने के दो तरीके हैं, जिसमें आप पढ़ते हैं (fd, buf, n) और पढ़ना वहां बैठता है और तब तक प्रतीक्षा करता है जब तक आपने एन बाइट्स को buf में पढ़ा नहीं है - या गैर-अवरुद्ध, जिसमें आपको जांचना है (चयन() या मतदान() का उपयोग करना) चाहे एफडी पठनीय हो, और फिर आपका पढ़ा जाए()।
टीसीपी-आधारित कनेक्शन से निपटने पर, ओएस पैकेट आकारों पर ध्यान नहीं देता है, क्योंकि इसे डेटा की निरंतर स्ट्रीम माना जाता है, अलग-अलग पैकेट आकार वाले भाग नहीं।
यदि आपका एप्लिकेशन "पैकेट" (पैक या अनपॅक किए गए डेटा संरचनाओं का उपयोग करता है जो आप पास कर रहे हैं) का उपयोग करते हैं, तो आपको उचित आकार तर्क के साथ पढ़ने() को कॉल करने में सक्षम होना चाहिए, और सॉकेट से एक संपूर्ण डेटा संरचना को पढ़ना चाहिए समय पर। यदि आप स्रोत और गंतव्य प्रणाली अलग-अलग बाइट एंडियन-नेस के मामले में हैं, तो आपको केवल एक ही चेतावनी के साथ निपटना है, जिसे आप भेज रहे हैं, ठीक से बाइट-ऑर्डर करना याद रखना है। यह यूडीपी और टीसीपी दोनों पर लागू होता है।
जहां तक * निक्स सॉकेट प्रोग्रामिंग का संबंध है, मैं अत्यधिक डब्ल्यू रिचर्ड स्टीवंस की "यूनिक्स नेटवर्क प्रोग्रामिंग, वॉल्यूम 1" (यूएनपीवी 1) और "यूनिक्स पर्यावरण में उन्नत प्रोग्रामिंग" (एपीयूई) की अत्यधिक अनुशंसा करता हूं। पहला नेटवर्क आधारित प्रोग्रामिंग के संबंध में एक टोम है, चाहे परिवहन के बावजूद, और बाद वाला एक अच्छी तरह से प्रोग्रामिंग पुस्तक है क्योंकि यह * NIX आधारित प्रोग्रामिंग पर लागू होता है। इसके अलावा, "टीसीपी/आईपी इलस्ट्रेटेड", वॉल्यूम्स 1 और 2.
बंद कनेक्शन के बाद प्रारंभिक वापसी नहीं होनी चाहिए "बाइट्स वापसी करें;" "रिटर्न रिट" के बजाय? मुझे लगता है कि readBytes फ़ंक्शन का मतलब बाइट्स की वास्तविक संख्या को वापस करने के लिए है। मुझे लगता है कि यदि कोई त्रुटि हो तो आप इसे गैर-पॉजिटिव पूर्णांक वापस करने के लिए परिभाषित कर सकते हैं, लेकिन आप यह भी पता लगा सकते हैं कि रीडबेट्स अनुरोध से अनुरोध की गई बाइट्स की एक अलग संख्या देता है या नहीं। –
त्रुटि प्रोग्राम को ध्वजांकित करने के लिए ऋणात्मक मान सी प्रोग्रामिंग में सामान्य प्रथा है और एपीआई के उपयोगकर्ता द्वारा भ्रम को रोकने के लिए जितना संभव हो उतना पालन किया जाना चाहिए। – Guss
मैंने पढ़ने के दौरान त्रुटि होने पर बाइट्स की संख्या को वापस करने के लिए मेरे उदाहरण फ़ंक्शन को संशोधित किया। सॉकेट के साथ ध्यान में रखने के लिए एक बिंदु यह है कि शून्य पढ़ने वाला एक पाठ इंगित करता है कि कनेक्शन बंद था, और यह आवश्यक रूप से एक त्रुटि नहीं हो सकती है। – dfjacobs