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 }
时间: 2024-10-21 19:05:33

readn和writen函数的相关文章

readn,writen,readline

unix的RIO提供的readn,writen,readline两类不同的函数: 1.无缓冲区的输入输出函数 rio_readn 1 ssize_t rio_readn(int fp, void *usrbuf, size_t n) 2 { 3 size_t nleft = n; 4 ssize_t nread; 5 char *bufp = usrbuf; 6 7 while(nleft > 0)//未读取一定数目的继续读,直到读取满足数目的字节 8 { 9 if((nread = read(

0723------Linux基础----------文件 IO 之 read 和 write (readn 、writen、readline)

1. readn 和 writen 1.1 基础巩固: read 和 write 函数的返回值 1.1.1 read 函数原型为:ssize_t  read(int fd, void* buf, size_t count); (这里的 void *在标准 C 中表示通用指针即任意类型的指针都可以对它赋值,ssize_t 是有符号整数)它的返回值如下: a)成功返回读取的字节数,这里可能等于 count 或者小于 count (当 count > 文件 size 的时候,返回实际读到的字节数):

网络编程readn、writen和readline函数的编写

readn   在Linux中,read的声明为: ssize_t read(int fd, void *buf, size_t count); 它的返回值有以下情形: 1.大于0,代表成功读取的字节数 2.等于0,代表读取到了EOF,一般是对方关闭了socket的写端或者直接close 3.小于0,出现错误. 我们编写一个readn函数,声明与read一致,但是,readn在未出错或者fd没有关闭的情况下,会读满count个字节. ssize_t readn(int fd, void *buf

网络编程Socket之TCP之read/write

从写一个TCP套接字的write调用成功返回仅仅表示我们可以重新使用原来的应用进程缓冲区,并不代表对端TCP或应用进程已接收到数据. 对端TCP必须确认收到的数据,伴随来自对端的ACK的不断到达,本端TCP至此才能从套接字发送缓冲区中丢弃已确认的数据,TCP必须为已发送的数据保留一个副本,直到它被对端确认为止. UDP不保存应用进程数据的副本因此无需一个真正的发送缓冲区,write调用成功返回表示所写的数据报或其所有分片已被加入数据链路层的输出队列. 对于read调用(套接字标志为阻塞),如果接

《网络编程》套接字编程简介

本节介绍的套接字是可以实现不同计算机之间的远程进程间通信.套接口是网络进程的 ID,在网络中每一个节点都有一个网络地址,也就是 IP 地址,两个进程间通信时,首先要确定各自所在网络节点的网络地址.但是,网络地址只要确定进程所在的计算机,由于一台计算机上同时可能有多个网络进程,所以仅凭网络地址还不能确定是网络中的哪一个进程,因此套接口中还需要其他信息,也就是端口.在一台计算机中,一个端口号只能分配给一个进程,所以,进程和端口之间是一一对应的关系.因此,使用端口号和网络地址的组合就能唯一地确定整个网

《UNIX环境高级编程中文版》pdf

下载地址:网盘下载 内容简介 编辑 本书内容权威,概念清晰,阐述精辟,对于所有层次UNIX程序员都是一本不可或缺的参考书. 作品目录 编辑 第1章 UNIX基础知识 1 1.1 引言 1 1.2 UNIX体系结构 1 1.3 登录 1 1.4 文件和目录 3 1.5 输入和输出 6 1.6 程序和进程 8 1.7 出错处理 10 1.8 用户标识 12 1.9 信号 14 1.10 时间值 15 1.11 系统调用和库函数 16 1.12 小结 17 习题 18 第2章 UNIX标准化及实现 1

apue读书笔记-第14章 高级IO

多路I/O转接 与select函数不同,poll不是为每个状态(可读性.可写性和异常状态)构造一个描述符集,而是构造一个pollfd结构数组,每个数组元素指定一个描述符编号以及其所关心的状态 readv和writev函数 作用:在一次函数调用中读.写多个非连续缓存区 总结:应当用尽量少的系统调用次数来完成任务.如果只写少量的数据,会发现自己复制数据然后使用一次write会比用writev更合算.但也可能发现,这样获得的性能提升并不值得,因为管理中间缓冲区会增加程序复杂度. readn和write

Linux网络编程函数

转自:http://blog.csdn.net/hrbeuwhw/article/details/8050911 1.字节序函数 #include<netinet.h> uint16_t htons(uint16_t host16bitvalue); uint32_t htonl(uint32_t host32bitvalue); 返回:网络字节序值 uint16_t ntohs(uint16_t net16bitvalue); uint32_t ntohl(uint32_t net32bit

linux应用程序编程应该要学习的函数使用列表

linux应用程序编程应该要学习的函数使用列表 linux应用层编程相关的man page,具体包括的命令和函数,请参考https://www.kernel.org/doc/man-pages/ select().pselect().poll().epoll(), epoll_create(),epoll_wait(),epoll_ctl(),close()==同时监控多个fd的输入.输出 inotify机制,inotify_init(),inotify_add_watch(),inotify_