unix 网络编程 readn writen readline

来源:互联网 发布:1688进货淘宝卖怎么样 编辑:程序博客网 时间:2024/05/29 17:03
/* include readn */#include"unp.h"ssize_t/* Read "n" bytes from a descriptor. */readn(int fd, void *vptr, size_t n){size_tnleft;ssize_tnread;char*ptr;ptr = vptr;nleft = n;while (nleft > 0) {if ( (nread = read(fd, ptr, nleft)) < 0) {if (errno == EINTR)nread = 0;/* and call read() again */elsereturn(-1);} else if (nread == 0)break;/* EOF */nleft -= nread;ptr   += nread;}return(n - nleft);/* return >= 0 */}/* end readn */ssize_tReadn(int fd, void *ptr, size_t nbytes){ssize_tn;if ( (n = readn(fd, ptr, nbytes)) < 0)err_sys("readn error");return(n);}


/* include writen */#include"unp.h"ssize_t/* Write "n" bytes to a descriptor. */writen(int fd, const void *vptr, size_t n){size_tnleft;ssize_tnwritten;const char*ptr;ptr = vptr;nleft = n;while (nleft > 0) {if ( (nwritten = write(fd, ptr, nleft)) <= 0) {if (nwritten < 0 && errno == EINTR)nwritten = 0;/* and call write() again */elsereturn(-1);/* error */}nleft -= nwritten;ptr   += nwritten;}return(n);}/* end writen */voidWriten(int fd, void *ptr, size_t nbytes){if (writen(fd, ptr, nbytes) != nbytes)err_sys("writen error");}


/* include readline */#include"unp.h"static intread_cnt;//刚开始可以置为一个负值(我的理解)static char*read_ptr;static charread_buf[MAXLINE];static ssize_tmy_read(int fd, char *ptr)//每次最多读取MAXLINE个字符,调用一次,每次只返回一个字符{if (read_cnt <= 0) {again:if ( (read_cnt = read(fd, read_buf, sizeof(read_buf))) < 0) {//如果读取成功,返回read_cnt=读取的字符if (errno == EINTR)goto again;return(-1);} else if (read_cnt == 0)return(0);read_ptr = read_buf;}read_cnt--;//每次递减1,直到<0读完,才执行上面if的命令。*ptr = *read_ptr++;//每次读取一个字符,转移一个字符return(1);}ssize_treadline(int fd, void *vptr, size_t maxlen){ssize_tn, rc;charc, *ptr;ptr = vptr;for (n = 1; n < maxlen; n++) {if ( (rc = my_read(fd, &c)) == 1) {*ptr++ = c;if (c == '\n')break;/* newline is stored, like fgets() */} else if (rc == 0) {*ptr = 0;return(n - 1);/* EOF, n - 1 bytes were read */} elsereturn(-1);/* error, errno set by read() */}*ptr = 0;/* null terminate like fgets() */return(n);}ssize_treadlinebuf(void **vptrptr){if (read_cnt)*vptrptr = read_ptr;return(read_cnt);}/* end readline */ssize_tReadline(int fd, void *ptr, size_t maxlen){ssize_tn;if ( (n = readline(fd, ptr, maxlen)) < 0)err_sys("readline error");return(n);}



0 0
原创粉丝点击