Welcome 微信登录

首页 / 操作系统 / Linux / readn writen实现Linux下Socket缓冲区读写

socket上的read write 操作不同与一般的文件IO操作,socket上的用read write读写的字节数可能比要求的少,但这并不是错误,原因是socket的缓冲区可能已经达到了极限。此时所需要的就是再次调用read write 以写入或输出剩余的字符。这种情况在socket中很常见,但在写字节流socket时只能在socket非堵塞的情况下才会出现,然而为预防实现万一返回不足的字符数值,我们总是调用writen和readn函数,而不是read和write.下面就是readn、writen函数源码:ssize_t      /* Read "n" bytes from a descriptor. */
readn(int fd, void *vptr, size_t n)
{
 size_t nleft;
 ssize_t nread;
 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 */
   else
    return(-1);
  } else if (nread == 0)
   break;    /* EOF */  nleft -= nread;
  ptr   += nread;
 }
 return(n - nleft);  /* return >= 0 */
}  ssize_t      /* Write "n" bytes to a descriptor. */
writen(int fd, const void *vptr, size_t n)
{
 size_t  nleft;
 ssize_t  nwritten;
 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 */
   else
    return(-1);   /* error */
  }  nleft -= nwritten;
  ptr   += nwritten;
 }
 return(n);
}Linux下GCC使用方法简介Linux系统目录说明相关资讯      Linux函数 
  • Linux C语言中gotoxy函数  (04月11日)
  • Linux进程之Fork函数  (04/16/2015 08:48:35)
  • Linux中getrusage的使用  (11/08/2014 07:07:38)
  • Linux内核中min和max的实现  (03月03日)
  • Linux下mmap函数的一个练习  (01/19/2015 21:11:21)
  • Linux下confstr与uname函数_获取C  (10/28/2014 20:23:36)
本文评论 查看全部评论 (0)
表情: 姓名: 字数