#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);
}
readn函数详解
本文详细介绍了readn函数的实现原理及使用方法。该函数用于从套接字描述符中读取指定数量的字节到缓冲区,通过循环读取直至完成全部数据的读取任务。文章还提供了一个readn函数的包裹函数Readn,用于简化调用过程并增强错误处理。
627

被折叠的 条评论
为什么被折叠?



