2012-12-23 12 views
5

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

void HandleTCPClient(int clntSocket) 
{ 
    FILE *request = fdopen(clntSocket, "r"); 
    char reader[2000]; 
    size_t q; //typo before 
    while((q=fread(reader, 1, sizeof(reader), request))>0) { //hangs here! 
     printf("i read something!\n"); 
    } 
    return; 
} 

धन्यवाद !!

संपादित करें: यदि ऐसा है तो मैं लाइन बनाने के "जबकि ((क्यू = fread (पाठक, 1, 1, अनुरोध))> 0) {"

मैं प्राप्त सभी अपनी स्क्रीन पर "मैं कुछ पढ़ा"। ..

यह सुनिश्चित नहीं है कि इसका क्या अर्थ है। तो क्या यह सही है कि अगर स्ट्रीम में कम से कम आपके बफर का आकार वर्ण मौजूद नहीं है तो क्या सचमुच कुछ भी नहीं करेगा?

+0

size_t q; क्षमा करें .. –

उत्तर

4

fgetsfread जबकि नई लाइन पढ़ी जाती है, तब तक अवरुद्ध हो जाती है जब तक कि अनुरोधित संख्या बाइट्स स्ट्रीम या ईओएफ पर उपलब्ध न हो। आपके मामले में, कॉल ब्लॉक क्योंकि आपके पास स्ट्रीम में तैयार डेटा के 2000 बाइट्स नहीं हैं।

+0

स्टैक करने के लिए अनुवाद टाइप करें यह होना चाहिए। आप महोदय एक चैंपियन हैं। –

+0

को तुरंत ध्यान में रखेगा ध्यान में रखेगा जैसे ही ईओएफ पहुंच जाएगा (फ़ाइल का अंत) –

+0

इस समस्या को हल करने का पसंदीदा तरीका क्या है ... क्या मुझे 1 बाइट बफर का उपयोग करना चाहिए? –

0

एक टीसीपी सॉकेट पर पढ़ने के लिए के बजाय fread() का उपयोग करना मेरे लिए अजीब लगता है ..?

वैसे भी, fread तब तक अवरुद्ध है जब तक पढ़ने के लिए कुछ भी नहीं है। लिनक्स पर उदाहरण के लिए आपको हमेशा यह जांचना चाहिए कि select() का उपयोग करके, सॉकेट पढ़ने या लिखने के लिए तैयार है।

+0

मुझे विश्वास है कि –

+1

पढ़ने के लिए कुछ है क्यों यह आपके लिए अजीब लगता है? 'Stdio' का उद्देश्य टुकड़े टुकड़े पढ़ने के लिए डेटा बफर करना है, इसलिए यदि आप यही चाहते हैं, तो इसका उपयोग क्यों न करें? – Dolda2000

+0

सहमत हैं, सॉकेट को फ़ाइलों के रूप में लपेटना अच्छा होता है ताकि आप बॉस फ़ंक्शंस जैसे फ़्रेड का उपयोग कर सकें .. सिवाय इसके कि जब आप स्पष्ट रूप से पसंद नहीं कर सकते हैं तो मैं हाहा नहीं कर सकता –

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