#include "unp.h"
/* Read "n" bytes from a descriptor: 从套接字描述符读取n个字节到定义好的缓冲区里去*/
ssize_t readn(int fd, void *vptr, size_t n)
{
size_t nleft; //size_t 是无符号整形,相当于unsigned int; 要读取的字节数
ssize_t nread; //ssize_t是有符号整形,相当于int; 读取到的字节数
char *ptr = NULL;
nleft = n; //将要读取的字节数给nleft;
ptr = vptr; //用ptr指向自己定义的缓冲区
while(nleft > 0) //当读取的字节数大于0时
{
if( (nread = read(fd, ptr, nleft)) < 0)
{
if(errno == EINTR) //EINTR在read()函数下表示:由于信号中断,没读到任何数据;
nread = 0; //如果是被信号打断了的话,就跳过本轮循环,在重新执行一次;
else
return (-1);
}
else if(nread == 0)
break;
nleft -= nread; //nleft = nleft - nread:"要读取的" - "已读取的" = "未读取的";
ptr += nread; //ptr = ptr + nread:让指针向后移动nread个字节,为下一轮要读取的数据挪地方,省的下次读到的数据把这次的给覆盖掉;
}
return (n - nleft); //用要读取的数据 - 未读取的数据 = 以读取的数据;
}
readn()的包裹函数(wrap fuction)
ssize_t Readn(int fd, void *ptr, size_t nbytes)
{
ssize_t n;
if ( (n = readn(fd, ptr, nbytes)) < 0)
err_sys("readn error");
return(n);
}