#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);
}