// 读写网络套接字时,由于内部缓冲约束和较长的网络延迟会引起read和write返回不足值。
// Rio包可以解决上述问题进行健壮地读和写
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
ssize_t rio_readn(int fd, void *usrbuf, size_t n)
{
size_t nleft = n;
ssize_t nread;
char *bufp = usrbuf;
while (nleft > 0)
{
if ((nread = read(fd, bufp, nleft)) < 0)
{
if (errno == EINTR)
{
nread = 0;
}
else
{
return -1;
}
}
else if (nread == 0)
{
break;
}
nleft -= nread;
bufp += nread;
}
return (n-nleft);
}
ssize_t rio_writen(int fd, void *usrbuf, size_t n)
{
size_t nleft = n;
ssize_t nwritten;
char *bufp = usrbuf;
while (nleft > 0)
{
if ((nwritten = write(fd, bufp, nleft)) <= 0)
{
if (errno == EINTR)
{
nwritten = 0;
}
else
{
return -1;
}
}
nleft -= nwritten;
bufp += nwritten;
}
return n;
}
Rio包
最新推荐文章于 2024-02-28 11:33:56 发布