针对传输大文件时,缓冲区达到极限,而需要多次读写的情况,比如传输视频文件。
重新read 和 write
ssize_t Readn(int fd, void* vptr, size_t n){
size_t left;
ssize_t nread;
char *ptr;
ptr = vptr;
nleft =n;
while(nleft >0){
nread = read(fd,ptr,nleft);
if(nread<0){
if(errno == EINTR)
nread=0;
else
return -1;
}
if(nread ==0)
break;
nleft -= nread;
ptr += nread;
}
return n - nleft;
}
ssize_t Writen(int fd, const void* vptr, size_t n){
size_t nleft;
ssize_t nwritten;
const char *ptr;
ptr=vptr;
nleft =n;
while(nleft >0){
nwritten = write(fd,ptr,nleft);
if(nwritten <=0){
if(nwritten<0&&errno==EINTR)
nwritten=0;
else
return -1;
}
nleft -=nwritten;
ptr +=nwritten;
}
return n;
}