字节流套接口的读写
字节流套接口的读写
字节流套接口上的read和write函数的使用与普通的I/O操作不同。由于内核中套接口的缓冲区是一个有限的空间,当这个缓冲空间不足以存储你要接收或发送的数据时,函数返回的字节数就会比预期发送的字节数少。这时,再次把剩余的数据操作一次即可。
为了预防缓冲区空间不足的情况,可以调用readn、writen、readline、writelin函数
readn函数:从一个描述字读n个字节
// return readn number ssize_t readn(int fd, void* vptr, size_t n) { size_t nleft; size_t nread; char* ptr; ptr = vptr; nleft = n; while(nleft > 0){ if((nread = read(fd, vptr, nleft)) < 0){ if(errno == EINTR) //由于信号中断,没读成功任何数据 nread = 0; else return -1; } else if(nread == 0) break; //EOF nleft -= nread; ptr += nread; } return (n - nleft); }
writen函数:往一个描述字写n字节
ssize_t writen(int fd, const void *vptr, size_t n) { size_t nleft; size_t nwriten; const void *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); }
readline函数:从一个描述字读文本,一次1个字节
ssize_t readline(int fd, void *vptr, size_t maxlen) { ssize_t n, rc; char c, *ptr; ptr = vptr; for(n = 1; n < maxlen; ++n){ again: if((rc = read(fd, &c, 1)) == 1){ *ptr++ = c; if(c == '\n') //以'/n'结束 break; } else if(rc == 0){ *ptr = 0; return n -1; } else{ if(errno == EINTR) goto again; return -1; } } *ptr = 0; return n; }
本文 由 cococo点点 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自:cococo点点 http://www.cnblogs.com/coder2012
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!