2012-08-24 35 views
6

C Çalışma kodum vardı ama neden işe yaramadığına dair hiçbir fikrim yoktu, bu yüzden yeniden yazmaya başladım, böylece neler olduğunu anlayabileyim.Recv() çıkışı nasıl kaydedilir?

Şimdiye kadar çok iyi! Yeniden yazdım ve şu anda olan her şeyi anladığımdan% 90 eminim; Ancak sorun, önceden ayrılmış arabamıza (htmlbff) recv (databff) tarafından alınan veri yığınının nasıl saklanacağı hakkında bir fikrim olmamasıdır. (Yani

#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;   
} 

:

(... vb, ben biraz bu soyunmuş olduğunu sadece temelleri, mesela hafıza yeniden dağıtılmasını içerir, böylece not veya koruma sızıntı) Aşağıdaki kodu düşünün Ben bu doğru yapıyorum ve şeyler olduğunu düşünüyorum sanırım) c geçerli veri yığın boyutu ve q şimdiye kadar alınan toplam veri miktarıdır (q döngü her tekrarlandığında c tarafından artırılır). Şu anda bellek kullanımı için q kullanıyorum (kimse merak ediyordu) ama bu sorunun çözümünde de amaca sahip olacağına inanıyorum.

İstediğim soru, herhangi bir oranda ikinci yoruma ilişkin. Verileri recv'den htmlbff'a doğru şekilde nasıl kaydederim?

cevap

2

Kullanım memcpy ve ofset htmlbffq tarafından:

memcpy(htmlbff + q, databff, c); 

yapabilirsiniz benzer recv doğrudan htmlbff içine:

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

Ama ayrı tampon tutmak iyidir ve tam kod bağlı Bu, işleri daha net hale getirebilir.

htmlbff sınırlarını aşmamak için BUFFERSIZE numaralı sorgulara karşı eklediğinizden emin olun. realloc işlemlerini kaldırdığınızı belirttiniz, bu yüzden zaten bunu zaten yapıyorsunuzdur.

Kişisel sabit isimleri veri tampon zaman her yığın büyüklüğü, databff yani boyutunu belirtmek için BUFFERSIZE kullanmak, biraz kafa karıştırıcı.

+0

çağırır. En kullanışlı olanını buldum çünkü artık arabelleği kullanarak atlayıp doğrudan htmlbff dosyasına yazabiliyorum. –

5

htmlbff numaralı veriyi kopyalamak için memcpy() kullanın, ancak htmlbff boyutunu aşmamanız da gerekir. BUFFERSIZE bayt alındığında ya da kullanın ve daha fazla veri içerecek şekilde htmlbff kullanın. Örneğin

:

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

Çok hoş, teşekkürler, ve tam olarak belleğimi nasıl idare ettiğimi anladım, hariç, tam olarak ne zaman bitmiş döngüde ihtiyaç duyduğum kadar bayt için arabellek boyutunu yeniden oluşturmak için bir adım daha ekledim. Yine cevabın için teşekkür ederim. –

1

Sen/yeniden tahsis = databff veri okur recv olarak bu şekilde (veri aşıyor soket MAXDATASIZE kapalı okursanız) tüm veri sığdırmak için tampon genişleyen tutmak için gereken htmlbff belleğinizde büyüyebilir ve sonra yeni okuma genel htmlbff'e eklenebilir.

q ve c, bulunduğunuz yeri ve ne kadar ileri gitmek zorunda olduğunuzu takip etmek için imleçler gibidir.bunun üzerine daha fazla işlem yapmak için gerekmedikçe Ben ne yapardım

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

, htmlbff içine recv() veriler yer almaktadır.

Eğer i - q her zaman başka recv() için oda olacak şekilde az MAXDATASIZE olduğu realloc()htmlbff zaman emin olun.

O zaman gerçekten bu cevap gibi teşekkür ederim recv(sock, htmlbff + q, MAXDATASIZE, 0)