readn,writen和readline函数

本文介绍了在网络编程中,由于内核缓冲区限制,read和write函数可能无法一次性完成数据传输,因此需要封装readn, writen和readline这三个辅助函数来确保完整读写。readn和writen通过循环调用来处理不足的字节读写,而readline则在读取行数据时考虑效率问题,提供了一个改进版的实现。" 115219652,9606642,理解评估指标:Precision、Recall、AP及mAP,"['机器学习', '计算机视觉', '评估指标', 'tensorflow']
摘要由CSDN通过智能技术生成

为什么需要这个函数

在字节流套接字上调用read或者write输入或输出的字节数可能比请求的数量少,然而这不是出错的状态。这个现象的原因在于内核中用于套接字的缓冲区可能已经到达了极限。这个时候所需的是调用者再次调用read或write函数,以输入或输出剩余的字节。
有些版本的Unix在往一个管道中写多余4096字节的数据时也会表现出这样的行为。这个现象在read一个字节流套接字时很常见,但是在write一个字节流套接字时只能在该套接字为非阻塞的前提下才出现。
举个例子来说:我们发送一个4000字节的数据,以太网帧格式一次最大只能1500字节,如果用read函数,读到1500字节就退出了,这个时候read函数就不能胜任这个工作了。
我们需要自己封装以下三个函数,这三个函数是每当我们读或者写一个字节流套接字时总要用到的函数。

#include “unp.h”
ssize_t readn(int filedes,void *buff,size_t nbytes);//从描述符fd中读取n个字节,存入vptr指针的位置。

思路如下:
1.当剩余度大于0就一直读
2.当read返回值为0时,退出循环
3.当read返回值大于0时,剩余度-read的返回值得到新的剩余度,指针偏移read返回值个单位,继续读
4.当read返回值小于0时,做异常检查,根据需求选择是否继续读
根据思路可以写出如下函数。

#include	"unp.h"

ssize_t						/* Read "n" bytes from a descriptor. */
readn(int fd, void *vptr, size_t n)
{
	size_t	n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值