글쎄 - 임시 파일의 장점은 사실 단순한 메모리 관리입니다. 그리고 성숙한/현대적인 많은 운영체제에서/tmp와 같은 짧은 수명의 파일에 대한 오버 헤드는 아주 적습니다. 그리고 개발자가 비싸기 때문에 시간이 많이 걸립니다. 파일 크기에 대한 아이디어가 있다면 꽤 일반적인 접근 방법은 아래와 같습니다.
하지만 정확히 원하는 것은 메모리 관리에 달려 있습니다. 휠을 다시 발명하는 것도 쉽습니다. 즉 apr_socket_recv() 및 관련 메모리 관리 (http://apr.apache.org/docs/apr/1.4/group_ 4월 _network__io -
이를 방지하는 좋은 방법은 http://apr.apache.org/ 4월 커먼즈 같은 것을 사용하는 것입니다 .html # gaa6ee00191f197f64b5a5409f4aff53d1). 일반적으로 이것은 장기적인 승리입니다.
ww.
// On entry:
// buffp - pointer to NULL or a malloced buffer.
// lenp - pointer for the length; set to 0 or the length of the malloced buffer.
// On exit
// return value < 0 for a fault, 0 for a connection close and > 0 for
// the number of bytes read.
// buffp will be filled out with the buffer filled; lenleftp with the bytes left
// (i.e not yet used).
// If post call *buffp != NULL you need to release/clean memory.
//
ssize_t sockread(..., unsigned char * * buffp , ssize_t * lenleftp) {
if (!buffp || !lenleftp)
return -1; // invalid params
// claim memory as needed.
if (*buffp == 0) {
*lenleftp = 16K;
*buffp = malloc(*lenleftp);
}
if (!*buffp || !*lenleftp)
return -2; // invalid params
ssize_t used = 0;
while(1) {
ssize_t l = recv(..., *buffp, *lenleftp - used, ..);
if (l < 0) {
// ignore transient errors we can retry without much ado.
if (errno == EAGAIN || errno == EINTR)
continue;
free(*buffp); *buffp = *lenleftp = NULL;
// report a fail.
return -3;
}
// we simply assume that a TCP close means we're done.
if (l == 0)
break;
used += l;
// increase buffer space as/when needed.
//
if (used >= lenleftp) {
*lenleftp += 32K;
*buffp = realloc(lenleftp);
};
}
// we're assuming that a read == 0-- i.e. tcp stream done means
// we're done with reading.
//
*lenleftp -= used;
return used;
}
당신은 더 많은 코드를 표시해야합니다. – unwind