《UNIX网络编程 卷1》 笔记: readn和writen函数
来源:互联网 发布:creis中指数据城市版 编辑:程序博客网 时间:2024/06/05 09:29
字节流套接字上调用read或write读取或写入的字节数可能比请求的数量少,然而这不是出错的状态。这个现象的原因在于内核中用于套接字的缓冲区可能已达到了极限(例如套接字的接收缓冲区可能没有数据或发送缓冲区没有可用空间),此时所需的是调用者再次调用read或write函数,以读取或写入剩余的字节。
我们实现的从套接字上读取n字节数据的readn函数和写入n字节数据到套接字的writen函数代码如下:
#include "unp.h"/*从套接字中读取n字节数据*/ssize_t 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;else /*错误*/return -1;} else if (nread == 0) /*遇到EOF*/break;nleft -= nread;ptr += nread;}return n - nleft;}/*包裹函数*/ssize_t Readn(int fd, void *vptr, size_t n){if (readn(fd, vptr, n) == -1)err_sys("readn error");}/*写入n字节数据到套接字*/ssize_t writen(int fd, const void *vptr, size_t n){ size_t nleft; ssize_t nwriten; const char *ptr; ptr = vptr; nleft = n; while (nleft > 0) { if ((nwriten = write(fd, ptr, nleft)) <= 0) { if (nwriten < 0 && errno == EINTR) /*重试*/ nwriten = 0; else /*错误*/ return -1; } nleft -= nwriten; ptr += nwriten; } return n;}/*包裹函数*/ssize_t Writen(int fd, const void *vptr, size_t n){ if (writen(fd, vptr, n) == -1) err_sys("writen error");}
注:read或write系统调用在执行过程中被信号打断时会产生EINTR错误,这时应该忽略这个错误并继续被中断的系统调用。
阅读全文
0 0
- 《UNIX网络编程 卷1》 笔记: readn和writen函数
- UNIX网络编程卷1:套接字联网-第3章:套接字编程-readn,writen函数
- unix网络编程readn,writen,readline包裹函数
- unix 网络编程 readn writen readline
- writen()和readn()函数
- UNIX安全读写函数——readn和writen
- readn, writen和readline函数
- readn,writen和readline函数
- readn和writen函数, socket编程常用函数
- CRC校验和网络通信中writen、readn函数
- UNIX 网络编程学习(7)--readn,writen,readline的实现
- readn和writen函数实现通信
- readn,writen,readline函数
- select和poll函数《UNIX网络编程卷一》笔记
- readn和writen
- 《UNIX网络编程 卷1》 笔记: 高级I/O函数
- UNIX网络编程——利用recv和readn函数实现readline函数
- 《UNIX网络编程 卷1》 笔记: 错误处理和包裹函数
- java问答
- 记录一个下载YouTube视频的网站和工具
- 给定一个经过一次旋转的有序数组,从中查找一个值,若存在返回它的索引,不存在返回-1
- 调用DLL函数例子
- Windows环境下手动更新boot2docker.iso
- 《UNIX网络编程 卷1》 笔记: readn和writen函数
- echarts+ajax+json动态生成多个不同随机颜色的柱状图
- 【PostgreSQL-9.6.3】约束
- 伽马函数
- Apache重写规则解析
- JQuery
- <最新资讯> AlphaGo Vs 柯洁第一局视频分享
- React学习DAY1
- debian 8 64环境下的Qt on Android安装