2011-10-15 7 views
7

मुझे निम्न तरीके से एक टीसीपी सॉकेट के लिए एक वर्णक मिला है:सॉकेट के लिए वर्णक फाइल पॉइंटर्स में परिवर्तित किया जा सकता है?

int desc = accept(socket_descriptor, &client_address, &len)

अब इस वर्णनकर्ता desc से मैं एक फ़ाइल सूचक प्राप्त करना चाहता हूं। Xzx12 यहां इस्तेमाल किया जा सकता है?

कारण मैं एक फ़ाइल सूचक प्राप्त करना चाहता हूं क्योंकि मैं किसी मौजूदा कोड में परिवर्तन कर रहा हूं जो स्थानीय फ़ाइल में डेटा लिखता है। अब, मैं अपनी कार्यक्षमता को विस्तारित करना चाहता हूं ताकि यह वैकल्पिक रूप से एक टीसीपी क्लाइंट को लिख सके। मैं सभी कार्यों को फिर से लिखना नहीं चाहता हूं और किसी भी तरह से मौजूदा बुनियादी ढांचे का उपयोग करने में सक्षम होने की सोच रहा था। मौजूदा फ़ंक्शन फ़ाइल को लिखने के लिए फ़ाइल पॉइंटर का उपयोग करते हैं। मैं सोच रहा था कि क्या कोई भी कार्य बिना किसी बदलाव के एक टीसीपी स्ट्रीम को लिखना संभव था।

उत्तर

8

हां, fdopen() बिल्कुल वही है जो आपको चाहिए। यहाँ है क्या man page इसके बारे में कह रहा है:

fdopen() फ़ंक्शन मौजूदा फ़ाइल वर्णनकर्ता, एफडी के साथ एक धारा एकत्रित करती है। स्ट्रीम का मोड (मानों में से एक "आर", "आर +", "डब्ल्यू", "डब्ल्यू +", "ए", "ए +") फ़ाइल डिस्क्रिप्टर के मोड के साथ संगत होना चाहिए। नई स्ट्रीम का फ़ाइल स्थिति संकेतक पर सेट है जो fd से संबंधित है, और त्रुटि और अंत-फ़ाइल संकेतक साफ़ किए गए हैं। मोड "डब्ल्यू" या "डब्ल्यू +" फ़ाइल के छंटनी का कारण नहीं बनता है। फ़ाइल डिस्क्रिप्टर को डुप्ड नहीं किया गया है, और बंद हो जाएगा जब fdopen() द्वारा बनाई गई धारा बंद है। Fdopen() को पर साझा करने का परिणाम साझा स्मृति ऑब्जेक्ट अपरिभाषित है।

लेकिन सावधानी के साथ इसका इस्तेमाल जब वर्णनकर्ता सॉकेट से लागू करने। उच्च स्तरीय I/O फ़ंक्शन बफरिंग का उपयोग करते हैं, और डेटा को अलग-अलग भेज सकते हैं (यानी \n स्ट्रीम में पाए जाते हैं, \r) आदि

+1

अधिकांश फ़ाइलें लाइन buffered, केवल 'stdout' नहीं हैं। मुझे यकीन नहीं है कि फ़ाइल को लाइन बफर करने के लिए एक फ़ाइल सेट करने का कोई तरीका है, लेकिन मेरा मानना ​​है कि ज्यादातर ब्लॉक बफर किए जाएंगे, जो थोड़ा सा सॉकेट अनुकूल होना चाहिए। –

+0

@ChrisLutz: फ़ंक्शन 'setlinebuf' है। मुझे लगता है कि 'stdout' केवल लाइन बफर किया गया है अगर यह टर्मिनल पर लगा हुआ है, लेकिन मुझे यकीन नहीं है। –

+0

@DietrichEpp - धन्यवाद। और मुझे लगता है कि आप 'stdout' के बारे में सही हैं। –

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

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