> FWIW, your current algorithm of adding BUFSIZ to size causes nonlinear > amount of work done in realloc, for reading large files. You might > want to increase memory by a constant factor or BUFSIZ, whichever is > larger (e.g., just like read-file does), and thus less often than you > recv.
So the following has been changed to: >> if (nread < BUFSIZ) >> break; >> else >> *size += BUFSIZ; if (nread < BUFSIZ) break; else *size += (*size / 2 > BUFSIZ) ? *size / 2 : BUFSIZ; Here is the entire function: size_t recvbuf (int sockfd, void **buffer, size_t *size) { size_t count = 0; ssize_t nread; if (*buffer == NULL) *size = BUFSIZ; for (;;) { *buffer = xrealloc (*buffer, *size); nread = recv (sockfd, *buffer + count, BUFSIZ, 0); if (nread == -1) error (EXIT_FAILURE, errno, "recv"); count += nread; if (nread < BUFSIZ) break; else *size += (*size / 2 > BUFSIZ) ? *size / 2 : BUFSIZ; } return count; } Happy hacking, Debarshi