我部落格中很少隻給出某些代碼的片段, 基本都是能夠直接運作的完整代碼, 本文我們隻給片段(很簡單), 下面來看看:
ssize_t readn(int fd, void *buf, int n)
{
size_t nleft = n; // left的意思是“剩下”, 而非“左邊”
char *bufptr = buf;
ssize_t nread;
while(nleft > 0)
{
if((nread = read(fd, bufptr, n)) < 0)
{
if(errno == EINTR) // 遇到中斷
{
continue; // 或者用 nread = 0;
}
else
{
return -1; // 真正錯誤
}
}
else if(nread == 0) // 對端關閉
{
break;
}
nleft -= nread;
bufptr += nread;
}
return (n - nleft);
}
說白了, 就一直讀, 讀到指定的位元組數為止。 其實, 在recv函數中, 最後參數如果是MSG_WAITALL, 那麼就可以用recv函數一行代碼, 替代上述所有代碼, 棒棒哒。 一直讀取到n個位元組, 在實際中, 是經常用到的方法, 太常見了。
再看:
ssize_t writen(int fd, void *buf, int n)
{
size_t nleft = n;
char *bufptr = buf;
ssize_t nwrite;
while(nleft > 0)
{
if((nwrite = write(fd, bufptr, n)) <= 0)
{
if(errno == EINTR)
{
nwrite = 0;
}
else
{
return -1;
}
}
nleft -= nwrite;
bufptr += nwrite;
}
return n;
}
說白了, 就一直寫, 寫到指定的位元組數為止。
不多說。