read,write是系统自己实现的库函数;
readn和writen是自己实现的函数。readn,接收确切数目的读操作,writen发送确切数目的写操作
readn函数
//封装read函数,接收确定字节数的读操作 ssize_t readn(int fd,void *buf,size_t count) { //剩余字节数 size_t nleft=count; //已接收字节数 ssize_t nread; char *bufp=(char*)buf; //既然不能够保证一次读操作能够返回的字节数是多少,所以需要循环进行接收 while(nleft>0) { if((nread=read(fd,bufp,nleft))<0) { //被信号中断的情况,这种情况不算出错,所以contiue if(errno==EINTR) continue; return -1; } //nread==0意味着对等方关闭了 else if(nread==0) return count-nleft; bufp+=nread; nleft-=nread; } return count; }
writen函数
//封装write函数 ssize_t writen(int fd,void *buf,size_t count) { //剩余要发送的字节数 size_t nleft=count; ssize_t nwritten; char *bufp=(char*)buf; //不能保证一次发送就能将所有数据发送成功 while(nleft>0) { if((nwritten=write(fd,bufp,nleft))<0) { if(errno==EINTR) continue; return -1; } else if(nwritten==0) continue; bufp+=nwritten; nleft-=nwritten; } return count; }