2012-08-24 22 views
6

सी में मेरे पास कोड कोड था लेकिन मुझे पता नहीं था कि यह क्यों काम करता है, इसलिए मैंने इसे फिर से लिखना शुरू कर दिया ताकि मैं वास्तव में समझ सकूं कि क्या हो रहा है।recv() के आउटपुट को कैसे स्टोर करें?

अब तक इतना अच्छा है! मैं फिर से लिखता हूं और 9 0% यकीन करता हूं कि मैं अब जो कुछ भी चल रहा हूं उसे समझता हूं; हालांकि, यह मुद्दा है कि मुझे नहीं पता कि मेरे पूर्व आवंटित बफर (htmlbff) में recv (databff) द्वारा प्राप्त डेटा खंड को कैसे स्टोर किया जाए।

निम्नलिखित कोड पर विचार करें (ध्यान दें कि मैं इस नीचे काफ़ी छीन, तो यह केवल मूल बातें, जैसे कोई स्मृति पुनः आबंटन शामिल या सुरक्षा रिसाव, आदि ...):

#define BUFFERSIZE 4096 
#define MAXDATASIZE 256 

char *htmlbff, databff[MAXDATASIZE]; 
int c, i = BUFFERSIZE, q = 0;   
if(!(htmlbff = malloc(i))) 
{ 
    printf("\nError! Memory allocation failed!"); 
    return 0x00; 
} 
while((c = recv(sock, databff, MAXDATASIZE, 0)) > 0) 
{ 
    /*memory checks stripped out since they are irrelevent for this post*/ 
    /*store data to the appropriate area in htmlbff*/ 
    q += c;   
} 

तो (यदि मैं यह सही कर रहा हूं, और चीजें चल रही हैं जैसा कि मुझे लगता है कि वे हैं) c वर्तमान डेटा खंड का आकार है, और q अब तक प्राप्त डेटा की कुल राशि है (q प्रत्येक बार लूप दोहराने पर c द्वारा बढ़ाया जाता है)। फिलहाल मैं मेमोरी हैंडलिंग के लिए q का उपयोग कर रहा हूं (यदि कोई सोच रहा था) लेकिन मुझे विश्वास है कि इस समस्या के समाधान में इसका उद्देश्य भी होगा।

किसी भी दर पर मैं जो प्रश्न पूछ रहा हूं वह दूसरी टिप्पणी के संबंध में है। मैं डेटा को रीव से htmlbff में सही तरीके से कैसे स्टोर करूं?

उत्तर

2

उपयोग memcpy, और ऑफसेट htmlbffq द्वारा:

memcpy(htmlbff + q, databff, c); 

आप कर सकते हैं इसी तरह recv सीधे htmlbff में:

c = recv(sock, htmlbff + q, MAXDATASIZE, 0)); 

लेकिन यह एक अलग बफर रखने के लिए ठीक है, और अपना पूरा कोड के आधार पर , यह चीजों को स्पष्ट कर सकता है।

सुनिश्चित करें कि आप BUFFERSIZE के विरुद्ध चेक जोड़ते हैं ताकि आप htmlbff की सीमाओं की प्रतिलिपि न लें। आपने उल्लेख किया है कि आपने realloc हैंडलिंग को हटा दिया है, तो हो सकता है कि आप इसे पहले से ही संभालेंगे।

आपका निरंतर नाम थोड़ा भ्रमित कर रहे हैं, जब डेटा बफरिंग मैं BUFFERSIZE का प्रयोग करेंगे प्रत्येक हिस्सा के आकार, अर्थात databff के आकार से संकेत मिलता है।

+0

मुझे वास्तव में यह जवाब पसंद है धन्यवाद। मैंने इसे सबसे उपयोगी पाया क्योंकि अब मैं केवल बफर का उपयोग करके छोड़ सकता हूं और सीधे HTMLbff में लिख सकता हूं। –

5

memcpy() का उपयोग htmlbff पर डेटा (प्रतिलिपि) करने के लिए करें, लेकिन आपको यह सुनिश्चित करने की भी आवश्यकता है कि आप htmlbff के आकार से अधिक न हों। BUFFERSIZE बाइट प्राप्त होने पर डेटा प्राप्त करना बंद करें या का उपयोग htmlbff को अधिक डेटा रखने के लिए करें।

उदाहरण के लिए:

char* htmlbff; 
size_t htmlbff_size = BUFFERSIZE; 
htmlbff = malloc(htmlbff_size); 

if (htmlbff) 
{ 
    while((c = recv(sock, databff, MAXDATASIZE, 0)) > 0) 
    { 
     if (c + q > htmlbff_size) 
     { 
      htmlbff_size *= 2; /* Arbitrary doubling of size. */ 
      char* tmp = realloc(htmlbff, htmlbff_size); 
      if (tmp) 
      { 
       htmlbff = tmp; 
      } 
      else 
      { 
       /* memory allocation failure. */ 
       free(htmlbff); 
       htmlbff = 0; 
       break; 
      } 
     } 
     memcpy(htmlbff + q, databff, c); 
     q += c; 
    } 
} 
+0

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

1

आप पुनः दिए जाने/सभी डेटा फिट करने के लिए बफर का विस्तार = इस तरह recv के रूप में databff में डेटा पढ़ता है (यदि डेटा सॉकेट से अधिक है MAXDATASIZE बंद पढ़ें) रखने की जरूरत है आपका htmlbff स्मृति में बढ़ सकता है और फिर नया पठन आपके समग्र HTMLbff में जोड़ा जा सकता है।

क्यू और सी कर्सर की तरह हैं कि आप कहां हैं और आप कितनी दूर जाना है इसका ट्रैक रखें।

memcpy(htmlbff+q, databff, c); //Do this in your whle loop to append the data 
2

मैं क्या करना होगा क्या जब तक आप उस पर और अधिक प्रसंस्करण करने की ज़रूरत है, htmlbff में recv() डेटा सीधे है।

सुनिश्चित करें कि आप realloc()htmlbff जब i - q तो MAXDATASIZE से कम है हमेशा एक और recv() के लिए कमरे है कि वहाँ बनाओ।

फिर आप recv(sock, htmlbff + q, MAXDATASIZE, 0)