J'ai besoin de recv() les données d'une socket et de les stocker dans un tampon, mais je dois m'assurer d'avoir toutes les données pour avoir des choses dans un boucle. Donc, pour m'assurer que je ne manque pas de place dans mon buffer, j'essaye d'utiliser realloc pour redimensionner la mémoire allouée au buffer. Jusqu'à présent, j'ai:realloc() ing mémoire pour un tampon utilisé dans recv()
// receive response
int i = 0;
int amntRecvd = 0;
char *pageContentBuffer = (char*) malloc(4096 * sizeof(char));
while ((amntRecvd = recv(proxySocketFD, pageContentBuffer + i, 4096, 0)) > 0) {
i += amntRecvd;
realloc(pageContentBuffer, 4096 + sizeof(pageContentBuffer));
}
Cependant, cela ne semble pas fonctionner correctement car Valgrind se plaint « valgrind: le « impossible » est arrivé: ». Des conseils sur la façon dont cela devrait être fait correctement?
Merci, Hristo
mise à jour ... J'ai réalisé que j'utilisais realloc mal. Voici une version révisée:
int i = 0;
int amntRecvd = 0;
char *pageContentBuffer = (char*) malloc(4096 * sizeof(char));
while ((amntRecvd = recv(proxySocketFD, pageContentBuffer + i, 4096, 0)) > 0) {
i += amntRecvd;
char *temp = realloc(pageContentBuffer, 4096 + sizeof(pageContentBuffer));
if (temp != NULL) {
pageContentBuffer = temp;
}
}
Cependant, valgrind est encore plaint:
==25812== Syscall param socketcall.recvfrom(buf) points to unaddressable byte(s)
==25812== at 0x33B880DAA1: recv (in /lib64/libpthread-2.5.so)
==25812== by 0x401D78: tunnelURL (proxy.c:371)
==25812== by 0x40142A: client_thread (proxy.c:194)
==25812== by 0x33B8806616: start_thread (in /lib64/libpthread-2.5.so)
==25812== by 0x33B7CD3C2C: clone (in /lib64/libc-2.5.so)
==25812== Address 0x5642768 is 0 bytes after a block of size 4,104 alloc'd
==25812== at 0x4A0590B: realloc (vg_replace_malloc.c:306)
==25812== by 0x401D47: tunnelURL (proxy.c:373)
==25812== by 0x40142A: client_thread (proxy.c:194)
==25812== by 0x33B8806616: start_thread (in /lib64/libpthread-2.5.so)
==25812== by 0x33B7CD3C2C: clone (in /lib64/libc-2.5.so)
pouvez-vous me donner un exemple précis de « Votre meilleur pari est de réallouer, copier puis supprimer la mémoire explicite » – Hristo
@Hristo int oldSize = la taille actuelle; currentSize + = 4096; char * newBuffer = malloc (currentSize); memcpy (newBuffer, pageContentBuffer, oldSize); gratuit (pageContentBuffer); pageContentBuffer = newBuffer; Je ne l'ai pas vérifié, mais c'est l'essentiel –
@Hristo - J'ai mis à jour le code –