socket编程之readn函数、writen函数、readline函数

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

猜你喜欢

转载自blog.csdn.net/wk_bjut_edu_cn/article/details/80396494