为什么需要这个函数
在字节流套接字上调用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