सॉकेट सेट अप करने के बाद, क्या यह सॉकेट डिस्क्रिप्टर पर पढ़ने (2) लिखने और लिखने (2) कॉल का उपयोग करने के लिए बेहतर अभ्यास है, या स्ट्रीम को संबद्ध करने के लिए fdopen (3) का उपयोग कर सॉकेट डिस्क्रिप्टर और फिर stdio (3) कार्यों का उपयोग करें?क्या मुझे सॉकेट्स को पढ़ने/लिखने के लिए फ़ाइल डिस्क्रिप्टर या स्ट्रीम का उपयोग करना चाहिए
int sfd = socket(PF_INET, SOCK_STREAM, 0);
// setup the socket using sfd
FILE * stream = fdopen(sfd, "r+");
// use fprintf, fscanf, etc
संपादित करें: मैं भी धारा
setbuf(stream, NULL)
unbuffer के रूप में टिप्पणी में उल्लेख किया है यह फ्लश करने के लिए होने से बचने के लिए।
मैं इस दृष्टिकोण का उपयोग कर रहा हूं क्योंकि यह मुझे FILE * धाराओं के लिए लिखे गए कोड का पुन: उपयोग करने देता है, और मुझे प्रारूप तारों का उपयोग करने में सक्षम होने का लाभ है। ऐसा लगता है कि जीएनयू एक अच्छा विचार है।
http://www.gnu.org/software/libc/manual/html_node/Streams-and-File-Descriptors.html
हालांकि आम तौर पर जब मैं सॉकेट का उपयोग कर कोड को देखते हैं, सॉकेट वर्णनकर्ता सभी कार्यों के लिए एक स्ट्रीम के बजाय प्रयोग किया जाता है। निचले स्तर के कार्यों का उपयोग करने के लिए कोई फायदा है?
याद रखें कि सी फ़ाइल स्ट्रीम डिफ़ॉल्ट रूप से buffered हैं, इसलिए आपको भेजते समय उन्हें स्वयं फ़्लश करना याद रखना होगा। और यदि आप सॉकेट को गैर-अवरुद्ध करते हैं तो भी पढ़ना ब्लॉक हो सकता है। –
यदि लपेटा I/O के साथ आपका प्रदर्शन पर्याप्त है, और यह कोड को सरल छोड़ देता है, बस इसका उपयोग करते रहें। – paddy
मेरी ओपिनियन में, पढ़ें() और लिखें() त्रुटि की स्थिति को अधिक सीधे आगे बढ़ाना, क्योंकि वे उनमें से किसी को मुखौटा करने की कोशिश नहीं करते हैं। – thuovila