2013-02-04 10 views
7

सॉकेट सेट अप करने के बाद, क्या यह सॉकेट डिस्क्रिप्टर पर पढ़ने (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

हालांकि आम तौर पर जब मैं सॉकेट का उपयोग कर कोड को देखते हैं, सॉकेट वर्णनकर्ता सभी कार्यों के लिए एक स्ट्रीम के बजाय प्रयोग किया जाता है। निचले स्तर के कार्यों का उपयोग करने के लिए कोई फायदा है?

+3

याद रखें कि सी फ़ाइल स्ट्रीम डिफ़ॉल्ट रूप से buffered हैं, इसलिए आपको भेजते समय उन्हें स्वयं फ़्लश करना याद रखना होगा। और यदि आप सॉकेट को गैर-अवरुद्ध करते हैं तो भी पढ़ना ब्लॉक हो सकता है। –

+0

यदि लपेटा I/O के साथ आपका प्रदर्शन पर्याप्त है, और यह कोड को सरल छोड़ देता है, बस इसका उपयोग करते रहें। – paddy

+1

मेरी ओपिनियन में, पढ़ें() और लिखें() त्रुटि की स्थिति को अधिक सीधे आगे बढ़ाना, क्योंकि वे उनमें से किसी को मुखौटा करने की कोशिश नहीं करते हैं। – thuovila

उत्तर

3

यदि आपको अधिक सटीक नियंत्रण और त्रुटि स्थितियों को संभालने की आवश्यकता है, तो read और write का उपयोग करें। यदि आप नहीं करते हैं, और stdio फ़ंक्शंस की सुविधा पसंद करते हैं, तो FILE* रैपर का उपयोग करें।

FILE * रैपर का उपयोग करने में एक समस्या यह है कि आपके पास सॉकेट पर डेटा कब और कब लिखा जाता है, इस पर नियंत्रण नहीं है। यदि आप सावधान नहीं हैं, तो इसके परिणामस्वरूप अक्षम नेटवर्क उपयोग और अत्यधिक देरी हो सकती है (देरी एसीके के साथ बातचीत करने वाले नागल के एल्गोरिदम के कारण)।

मैं read और write का उपयोग करने की सलाह दूंगा यदि यह एक उच्च-प्रदर्शन इंटरनेट एप्लिकेशन है।

+0

ठीक है, यहां तक ​​कि अधिक सटीक नियंत्रण 'रिकिव' और 'प्रेषण' के साथ प्राप्त किया जा सकता है क्योंकि वे 'MSG_NOSIGNAL' जैसे झंडे निर्दिष्ट करने की अनुमति देते हैं। –

संबंधित मुद्दे

 संबंधित मुद्दे