readn和writen函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了readn和writen函数相关的知识,希望对你有一定的参考价值。

  1 int readn(int connfd, void *pbuf, int nums)
  2 {
  3     int nleft = 0;
  4     int nread = 0;
  5     char *pread_buf = NULL;
  6     struct timeval select_timeout;
  7     fd_set rset;
  8     int ret = 0;
  9 
 10     memset(&select_timeout, 0, sizeof(select_timeout));
 11 
 12     if ((connfd <= 0) || (NULL == pbuf) || (nums <= 0))
 13     {
 14         printf("readn: param err.\n");
 15         return -1;
 16     }
 17 
 18     pread_buf = (char *)pbuf;
 19     nleft = nums;
 20 
 21     while (nleft > 0)
 22     {
 23         select_timeout.tv_sec = 10;
 24         select_timeout.tv_usec = 0;
 25 
 26         FD_ZERO(&rset);
 27         FD_SET((unsigned int)connfd, &rset);
 28         ret = select(connfd + 1, &rset, NULL, NULL, &select_timeout);        
 29         if (ret < 0)
 30         {
 31             printf("readn: select failed, %s\n", strerror(errno));
 32             return -1;
 33         }
 34         else if (ret == 0)
 35         {
 36             break;
 37         }
 38         else
 39         {
 40             if (FD_ISSET(connfd, &rset))
 41             {
 42                 nread = recv(connfd, pread_buf, nleft, 0);
 43                 if (nread < 0)
 44                 {
 45                     perror("recv");
 46                     if (EINTR == errno)
 47                     {
 48                         nread = 0;
 49                     }
 50                     else
 51                     {
 52                         printf("recv, %s\n", strerror(errno));
 53                         return -1;
 54                     }
 55                 }
 56                 else if (0 == nread)
 57                 {
 58                     break;
 59                 }
 60                 else
 61                 {
 62                     nleft -= nread;
 63                     pread_buf += nread;
 64                 }
 65             }
 66             else
 67                 return -1;
 68         }
 69     }
 70 
 71     return(nums - nleft);
 72 }
 73 
 74 int writen(int connfd, void *pbuf, int nums)
 75 {
 76     int nleft = 0;
 77     int nwritten = 0;
 78     char *pwrite_buf = NULL;
 79     struct timeval select_timeout;
 80     fd_set rset;
 81 
 82     memset(&select_timeout, 0, sizeof(select_timeout));
 83 
 84     if ((connfd <= 0) || (NULL == pbuf) || (nums < 0))
 85     {
 86         printf("writen: param err.\n");
 87         return -1;
 88     }
 89 
 90     pwrite_buf = (char *)pbuf;
 91     nleft = nums;
 92 
 93     while(nleft > 0)
 94     {
 95 
 96         select_timeout.tv_sec = 10;
 97         select_timeout.tv_usec = 0;
 98 
 99         FD_ZERO(&rset);
100         FD_SET((unsigned int)connfd, &rset);
101         if (select(connfd + 1, NULL, &rset, NULL, &select_timeout) <= 0)
102         {    
103             printf("writen: select failed, %s\n", strerror(errno));
104             return -1;
105         }
106 
107         if (-1 == (nwritten = send(connfd, pwrite_buf, nleft, MSG_NOSIGNAL)))
108         {
109             if (EINTR == errno)
110             {
111                 printf("EINTR\n");
112                 nwritten = 0;
113             }
114             else 
115             {
116                 printf("Send() error, 0x%x\n", errno);
117                 return -1;
118             }
119         }
120         nleft -= nwritten;
121         pwrite_buf += nwritten;
122     }
123 
124     return(nums);
125 }

 

以上是关于readn和writen函数的主要内容,如果未能解决你的问题,请参考以下文章

(P9)socket编程四:流协议与粘(nian)包,粘包产生的原因,粘包处理方案,readn,writen 6.回射客户/服务器

《UNIX网络编程》 -- 第五章

ffmpeg rtmp 推流错误WriteN, RTMP send error 10053 10038

VSCode自定义代码片段——声明函数

VSCode自定义代码片段8——声明函数

在 Visual Studio 中创建构造函数的代码片段或快捷方式