1,read 原型,参数以及返回值。

#include <uinstd.h>ssize_t read(int fd, void *buf, size_t nbytes);

-----read,只是将内核中缓冲区的数据搬到用户进程空间。

参数:

fd:某个连接的套接字。

buf:从内核缓冲区读入的数据放到用户缓冲区的地址。

nbytes:希望读入的数据大小,一般不是真正读人的大小。

返回值:实际读取的长度。

-1:error会被置为相应的值。

error:为EAGAIN,表示在非阻塞下,此时无数据到达,立即返回。

error:为EINTR,表示被信号中断了。

0:对端已关闭,本端也需要close 该套接字。

>0:实际读取的数据长度。

2,read 阻塞和非阻塞下的区别:
阻塞下
        原则是在不超过指定的长度下,有多少读多少,没有数据则一直等待,有可能会被信号中断。

比如,对端write写了10字节,本端read 读20字节,则此时read 直接返回,不用等待数据到达20字节后再返回,返回的长度是10字节。

非阻塞
       没有数据的话,返回-1,并置相应的error;有数据的话直接返回读入的数据大小,不超过指定的长度。

比如,对端write写了10字节,本端read 只读5字节,则此时read 端返回5字节,剩下的5字节需要下次再读入,这种情况下需要循环读入。

3,read 循环读。

int nread(int fd, char *buf, int nbytes)
{int len = 0;int left = nbytes;char *ptr = buf;while(left){len = read(fd, ptr, left);if(len == -1){if(error == EAGAIN)len = 0;}if(len == 0){close(fd);break;}left -= len;ptr += len;}return nbytes;
}

4,为什么read 不能一次性读完,需要循环来读?

当fd为管道或socket时,对方数据多次发送或网络延时较大时,一次read 都可能只读到部分数据。(因为tcp是面向字节流的)

5,总结

read 阻塞下 非阻塞
无数据 一直等待 立马返回-1,error置为EAGAIN
有数据 返回数据的大小(不超过指定的读入大小) 返回数据的大小(不超过指定的读入大小)

————————————————
版权声明:本文为CSDN博主「u010765526」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010765526/article/details/89425129

心得:

1)read函数阻塞和非阻塞的区别,主要是缓冲区里没有数据的情况下,阻塞的话,会一直等,非阻塞的话,会立即返回,报错提醒。当缓冲区里由数据的情况下,二者是一样的。

2)无论阻塞还是非阻塞,缓冲区里在不超过指定读的字节长度时,有多少立即返回多少。

3)read函数返回值为0,表示对端的socket已经关闭的理解:

以阻塞情况分析:假设对端没关闭,如果缓冲区没数据,read死等,

假设缓冲区有数据,read,返回不超过指定的字节数(>0);

错误返回-1;

也就是说,对于阻塞的情况,read只要返回了,如果没有发生过错误,就是读到数据了。

网络编程 read 阻塞和非阻塞下的区别相关推荐

  1. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)...

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程并行与并发同步与异步阻塞与非阻塞CPU密集型与IO密集型 线程与进程 进程 前言 ...

  2. (转载)网络编程释疑之:同步,异步,阻塞,非阻塞

    一讲到网络编程的I/O模型,总会涉及到这几个概念.问了很多人,没几个能清晰地讲出他们之间的区别联系,甚至在网络上也有很多不同的观点,也不知是中国文字释义的博大精深,还是本来这几个概念就是绕人不倦.今天 ...

  3. 网络编程释疑之:同步,异步,阻塞,非阻塞

    一讲到网络编程的I/O模型,总会涉及到这几个概念.问了很多人,没几个能清晰地讲出他们之间的区别联系,甚至在网络上也有很多不同的观点,也不知是中国文字释义的博大精深,还是本来这几个概念就是绕人不倦.今天 ...

  4. linux网络编程--阻塞与非阻塞

    linux网络编程--阻塞与非阻塞 建立连接 接受连接 无阻塞的设置方式 read() write() 读操作 写操作 Linux fcntl函数详解 功能描述 函数原型 fcntl()函数五种功能 ...

  5. C++网络编程快速入门(三):阻塞与非阻塞式调用网络通信函数

    目录 阻塞与非阻塞定义 send与recv connect 一些问题 为什么要将监听socket设置为非阻塞 阻塞与非阻塞定义 阻塞模式指的是当前某个函数执行效果未达预期,该函数会阻塞当前的执行线程, ...

  6. Linux Socket网络编程UDP、TCP 阻塞与非阻塞 断线重连机制

    三种非阻塞模式的方法: (1) fcntl函数 int Mode = fcntl(sockfd, F_GETFL, 0);       //获取文件的Mode值     fcntl(sockfd, F ...

  7. 【Linux网络编程学习】阻塞、非阻塞、同步、异步以及五种I/O模型

    文章目录 1. 基本概念 1.1 阻塞与非阻塞 1.2 同步与异步 1.3 为什么没有"异步阻塞" 2. 五种IO模型 2.1 阻塞 blocking 2.2 非阻塞 non-bl ...

  8. 网络编程中同步与异步,IO阻塞与非阻塞总结

    IO操作分两个阶段 第1个阶段:等待数据准备好(从外部设备磁盘或网络读到内核缓冲区): 第2个阶段:采用系统调用(内核进程),操作系统内核将数据从内核缓冲区读到用户空间. 第1阶段花费的时间远远大于第 ...

  9. Linux网络编程之阻塞与非阻塞

    文章目录 第1关:阻塞 第2关:非阻塞 第3关:阻塞与非阻塞切换 第1关:阻塞 #include <sys/socket.h> // 包含套接字函数库 #include <fcntl ...

最新文章

  1. VirtualBox 虚拟Ubuntu系统与主机互ping
  2. ARMS V4.3发布,应用监控全新支持内存快照分析,全息排查等功能。
  3. JSON.parse与eval的区别
  4. 在gem5的full system下运行 x86编译的测试程序 running gem5 on ubuntu in full system mode in x86...
  5. Appium移动自动化配置-ios安卓
  6. OPA 3 - thirdParty Qunit.js and IFrame load logic
  7. H5网页适配 iPhoneX,就是这么简单
  8. 时间戳 java_java中获取时间戳的方法
  9. HTML期末作业-宠物网
  10. 利用扩展欧几里得算法编程求逆元
  11. 临时生成oracle快照,oracle 11g dataguard 使用快照实现临时读写
  12. jQuery基础学习笔记(中)
  13. java token redis生成算法_如何访问 Redis 中的海量数据,服务才不会挂掉?
  14. TX2Ubuntu16.04上安装 kinectV2
  15. nodejs gulp less编辑
  16. python基本数据类型和简单用法
  17. 完成个人中心—导航标签2
  18. 中国民生银行借助Kubernetes的转型 | 凌云时刻
  19. linux centos系统清理垃圾,centos 清理内存缓存
  20. html公历农历相互转换,JavaScript实现公历转换农历

热门文章

  1. app与服务器对接的http 协议与socket协议区别
  2. linux时间同步解析,linux adjtimex详解时间偏差函数ntp同步与offset
  3. iphone录屏在哪里打开?手机上有哪些录制的方法
  4. zabbix监控服务器性能,使用zabbix监控apache性能
  5. 推荐系统笔记(三):NDCG Loss原理及其实现
  6. MySQL查看表结构和注释
  7. java 读取12306最新火车站信息并存储
  8. C语言合法标识符输入空格的处理
  9. 抽象思维-程序员系列第一弹
  10. 商场三十六计——第19计 “釜底抽薪”