非阻塞IO

阻塞式IO和非阻塞式IO 什么是阻塞式IO,什么是非阻塞式IO?区分他们有何用? 使用java的阻塞式IO实现非阻塞式IO。 怎么使用c语言实现非阻塞式socket线程? 阅读详情

套接口缺省是阻塞的。这一点意味着当发出一个不能立即完成的套接口调用时,其进程将被投入睡眠,等待响应操作完成。

1.输入操作:read、readv、recvfrom。

如果某个进程对一个阻塞的TCP套接口调用这些函数之一,而且该套接口的接收缓冲区中没有数据可读,该进程将投入睡眠,直到一些数据到达。既然TCP是字节流协议,该进程的唤醒就只需到达一些数据:这些数据可能是单个字节,也可以是一个完整的TCP分节中的数据。如果想等到某个固定数目的数据可读为止,那么可以调用我们的readn函数,或者指定MSG_WAITALL标志。UDP是数据报协议,如果一个阻塞的UDP套接口的接收缓冲区为空,对他调用输入函数的进程将睡眠,直到到达一个完整的UDP数据报。

对于非阻塞的套接口,如果输入操作不能被满足(TCP套接口即至少有一个字节的数据可读,对于UDP套接口即有一个完整的数据报可读),相应调用立即返回一个EWOULDBLOCK错误。


2.输出操作:write,writev,send,sendto等

对于TCP套接口,内核将从应用进程的缓冲区拷贝数据到套接口的发送缓冲区。对于阻塞的套接口,如果其发送缓冲区没有空间,进程将被投入睡眠,直至有空间为止。

对于一个非阻塞的TCP套接口,如果其发送缓冲区中根本没有空间,输出函数调用将立即返回一个EWOULDBLOCK错误。如果其发送缓冲区有一些空间,返回值将是内核能够拷贝到改缓冲区中的字节数。

UDP套接口不存在真正的发送缓冲区,内核只是拷贝应用进程数据并把它沿着协议栈向下传送,渐次冠以UDP头部和IP头部,因此对一个非阻塞UDP套接口,输出函数不会因与TCP套接口一样的原因阻塞,不过可能因其他原因阻塞。


3.accept

阻塞:无连接到达,进程睡眠

非阻塞:如果对一个非阻塞的套接口调用accept函数,并且尚无新的链接到达,accept调用将立即返回EWOULDBLOCK错误


4.connect

如果对一个非阻塞的TCP套接口调用connect,并且连接不能立即建立,那么连接的建立照样发起(譬如发送三次握手的第一个分组),不过返回一个EINPROGRESS错误。注意这个错误不同于上述三种情况的错误。另请注意有些连接可以立即建立,这主要发送在服务器和客户机在同一个机器的情况。因此对一个非阻塞的connect,我们也得预备connect成功返回情况发生。


OpenIddict实战:5步搞定.NET Core应用的OIDC单点登录集成 本文详细介绍了如何使用OpenIddict在.NET Core应用中快速实现OIDC单点登录集成。通过五个关键步骤,包括环境准备、数据库集成、客户端注册、令牌配置和多应用SSO集成,帮助开发者高效构建安全的企业级单点登录解决方案。 阅读详情

相关推荐

【论文+代码】ZS-N2N实现小样本零网络图像去噪

本文涵盖论文原文讲解与代码复现。

weixin_46287760的博客 4001

socket阻塞与非阻塞实验(recv或read读返回值)(带实例)

状态处于睡眠和运行中交替执行,且cpu占用率高。 屏蔽以下两行。 int flags = fcntl(sfd, F_GETFL, 0); //获取文件的flags值。 fcntl(sfd, F_SETFL, flags | O_NONBLOCK); //设置成非阻塞模式; 阻塞在accept这里。不执行了。 进程状态如下,一直处于sleep状态中,且不占用cpu.客户端程序: 2.1服务器端阻塞的cfd 1)此时listenfd为阻塞态

modi000的博客 1503

基于深度强化学习的无地图移动机器人导航:让机器人在未知环境中智能前行

虽然仍然面临sim-to-real差距、安全性保证等挑战,但随着算法的不断改进和计算能力的提升,基于DRL的无地图导航技术将在服务机器人、工业自动化、太空探索等领域发挥越来越重要的作用,为人类生产和生活带来更大便利和价值。对于复杂环境下的动态目标导航问题,研究人员提出了多智能体协同控制算法(如Teamwork-Net算法),通过多个智能体分别控制机器人的运动速度与运动方向,协同实现更高效、更稳定的导航性能。深度强化学习结合了深度学习的感知能力和强化学习的决策能力,非常适合解决无地图导航问题。

weixin_45131592的博客 902

非阻塞connect()和accept()

非阻塞connect()和accept()一.accept()函数1.阻塞模式阻塞模式下调用accept()函数,而且没有新连接时,进程会进入睡眠状态。2.非阻塞模式非阻塞模式下调用accept()函数,而且没有新连接时,将返回EWOULDBLOCK错误。非阻塞模式select() + accept() sockfd = listen_tcp();//socket()、bind()、listen()FD_SET(sockfd, rset);while(1){select(sockfd + 1, rset,

hanchaoman的专栏 1万+

CATIA二次开发实战:我用VBA写了个BOM表自动导出工具,效率提升80%

本文详细介绍了如何利用VBA进行CATIA二次开发,构建BOM表自动导出工具的全过程。通过智能解析算法、异常处理机制和性能优化技巧,该工具将BOM表生成时间从2.5小时缩短至8分钟,效率提升80%。文章还探讨了与PDM系统集成和定制化报告生成等扩展应用,为机械设计工程师提供了实用的自动化解决方案。

weixin_33709590的博客 553

Python 格点数据插值到站点 最邻近插值 双线性插值

python 气象数据格点数据插值到站点,最邻近插值法,双线性插值法

好记性不如烂笔头 8457

关于TCP使用上的一些总结

连接: 1.accept返回-1 accept返回-1表示获取tcp全连接队列中的连接的时候失败,会对errno进行设置: errno == EWOULDBLOCK 表示全连接队列为空,这个在阻塞IO中见不到,在非阻塞IO中会见到 2.linux中全连接队列的大小设置 这个是在listen的时候由传入的backlog参数指定,mac系统的话backlog指定的是半连接队列和全连接队列对的总和。 3.connect返回-1 errno == EINPROGRESS 表示正在建立连接 errno

lswdcyy的博客 4258

制作3D地形图的方法-使用GlobalMapper和3ds Max软件

打开GlobalMapper软件,在菜单栏中选择“文件”>“打开数据文件”,然后选择相应的高程数据文件。在菜单栏中选择“渲染”>“渲染设置”,根据需要进行设置,如分辨率和输出格式。选择地形对象,点击菜单栏中的“渲染”>“材质编辑器”,然后根据需要调整材质属性,如颜色、纹理和光照等。在菜单栏中选择“工具”>“高程栅格和网格”>“创建地形网格”。在菜单栏中选择“文件”>“导出”>“导出栅格格式”。打开3ds Max软件,在菜单栏中选择“文件”>“导入”,然后选择之前导出的地形数据文件。步骤3:导出地形网格。

JqlScala的博客 1535

非阻塞式I/O

概述 套接字的默认状态是阻塞的。这就意味着当发出一个不能立即完成的套接字调用时,其进程将被投入睡眠,等待响应操作完成。可能阻塞的套接字调用可分为以下四类: 输入操作,包括read、readv、recv、recvfrom和recvmsg共5个函数。如果某个进程对一个阻塞的TCP套接字(默认设置)调用这些函数之一,而且该套接字的接收缓冲区中没有数据可读,该进程将被投入睡眠,直到有一些数据到达。如果...

辉哥仔 688

uniapp - 最新实现APP连接使用MQTT流程及源码教程,uniapp app端接入mqtt发布订阅和接收消息队列传送消息、断开重连等各种示例代码(完美兼容安卓Android与苹果ios手机)

uniapp app端接入mqtt示例代码教程,uni-app中使用mqtt,uniapp安卓app接入mqtt,uniApp苹果ios集成MQTT教程,uniapp vue3 mqtt app端的接入流程,uniapp开发安卓和ios如何在项目里集成mqtt,Mqtt协议,uniapp开发APP,主动连接mqtt,订阅消息,实现发布,订阅和接收消息,如何在uniapp项目中使用mqtt,uniapp mqtt的使用示例,mqtt连接报错,搭建MQTT通讯做聊天项目,uniapp与设备通信 通过mqtt实现

🏆 前端领域优质创作者 6570

Android Google 支付接入

1. 从 2023 年 8 月 2 日起,所有新应用都必须使用结算库版本 5 或更高版本。自 2023 年 11 月 1 日起,现有应用的所有新版本都必须使用结算库版本 5 或更高版本。 2. 如果您的应用以 Android 14 或更高版本为目标平台,您必须更新到 PBL 5.2.1 或 PBL 6.0.1 或更高版本。

帅次的博客 9404

TCP Server处理多Client请求的方法—非阻塞accept与select

参看基于TCP/UDP的socket代码,同一时间Server只能处理一个Client请求:在使用当前连接的socket和client进行交互的时候,不能够accept新的连接请求。为了使Server能够处理多个Client请求,常见的方法: 多进程/线程方法、non-blocking socket(单进程并发)、non-blocking和select结合使用。三种方法各有优缺点,下面进行详细分析和说明。 一、多进程/线程方法 这种方法,每个子进程/线程单独处理一个client连接。以使用进程为例,在每个a

KEN Bolg 4663

化工过程控制软件:Siemens PCS 7二次开发_(8).过程控制算法

在化工过程控制中,过程控制算法是实现自动化控制的关键技术之一。Siemens PCS 7 提供了丰富的控制算法库,但为了满足特定的工艺需求,往往需要进行二次开发。本节将详细介绍如何在 Siemens PCS 7 中进行过程控制算法的二次开发,包括常见的控制算法原理、实现方法和具体示例。

kkchenjj的博客 502

同步阻塞io、同步非阻塞io、异步阻塞io和异步非阻塞io详解和区别

同步阻塞 I/O 简单易用,但可能导致性能问题;同步非阻塞 I/O 可以减少阻塞等待的时间,但需要频繁轮询状态;异步非阻塞 I/O 在高并发环境下表现优秀,但编程复杂度较高。

2301_77760093的博客 3595

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

5种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO

5种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO 看了一些文章,发现有很多不同的理解,可能是因为大家入切的角度、环境不一样。所以,我们先说明基本的IO操作及环境。本文是在《UNIX网络编程 卷1:套接字联网API》6.2节"I/O 模型 "的基础上,即UNIX/LINUX环境下的网络 IO环境下的理解,它里面给出的例子是读取(接收)网络UDP数据。下面简单写写自己对这些IO...

tjiyu的博客 3万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

深入理解非阻塞同步IO和非阻塞异步IO

这篇文章分析了Linux下的5种IO模型 http://blog.youkuaiyun.com/hguisu/article/details/7453390 很多人对阻塞 / 非阻塞, 同步 / 异步 的概念理解的不深入,搞不清楚非阻塞和异步IO的区别,笼统的认为非阻塞IO就是异步IO。其实区别很大,编程模型完全不同。 阻塞 / 非阻塞描述的是函数,指访问某个函数时是否会阻塞线程(bl

ITer_ZC的专栏 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

阻塞IO、非阻塞IO的区别

1.类与类之间的关系:依赖,实现,泛化(继承),关联,组合,聚合。 1)依赖(虚线):一个类是 另一个类的函数参数 或者 函数返回值。 2)实现(实线加小圆):对纯虚函数类(抽象类)的实现。 3)继承 即 泛化(实线加空心三角形,从子类指向父类):表示一个类与另一个类之间的继承关系; 4)关联(实线):一个类是另一个类的成员变量。 5)聚合(菱形加实线):整体和部分的关系。不太紧密的(如:汽车与发

yyxyong的博客 3万+

IO 中的阻塞、非阻塞、同步、异步及五种IO模型

本文深入解析了Linux系统中的五种I/O模型:阻塞I/O、非阻塞I/O、I/O多路复用、信号驱动I/O和异步I/O。文章首先阐述了I/O操作的两个关键阶段(数据准备和数据传输),并在此基础上比较了不同模型的特点、工作流程和适用场景。特别指出阻塞和非阻塞模式都属于同步I/O范畴,只有异步I/O才是真正的异步操作。通过分析各模型的实现机制和性能特点,为开发者在高并发场景下选择合适的I/O策略提供了理论依据。文章还区分了业务开发中的同步/异步概念与I/O模型的差异,帮助读者建立更全面的理解。

2301_76564925的博客 3429

面试官:简单说一下阻塞IO、非阻塞IO、IO复用的区别 ?

在《Unix网络编程》一书中提到了五种IO模型,分别是:阻塞IO、非阻塞IO、IO复用、信号驱动IO以及异步IO。本篇文章主要介绍IO的基本概念以及阻塞IO、非阻塞IO、IO复用三种模型,供大家参考学习。

qq_43416206的博客 5918

非阻塞 IO

文章介绍了五种IO模型中的非阻塞IO实现方式。重点讲解了使用fcntl系统调用设置文件描述符为非阻塞模式的方法,包括获取当前标志位(F_GETFL)和设置非阻塞标志(O_NONBLOCK)的步骤。作者通过示例代码展示了如何将标准输入设置为非阻塞模式,并详细说明了非阻塞read的返回值处理:当n>0时表示成功读取,n=0表示输入结束,n<0时需要根据errno区分是真正出错(EINTR)还是数据未就绪(EAGAIN/EWOULDBLOCK)。该文为后续讲解select多路复用技术奠定了基础。

Small_entreprene的博客 852

Java 中的阻塞 IO 和非阻塞 IO

IO(输入输出)操作是一个基础而又关键的部分。在 Java 中,处理 IO 通常涉及到阻塞 IO 和非阻塞 IO 两种模式。本文将介绍这两种模式的概念、特点以及在 Java 编程中的应用场景与区别。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 5870

Servlet——非阻塞IO

Servlet 新特性包括: 强制更改Session Id、非阻塞IO等; Servlet底层的IO是通过两个流来支持的: ——ServletInputStream ——ServletOutputStream 在Servlet中使用非阻塞IO非常简单,步骤如下: 1.通过ServletRequest 的 startAsync() 开启异步模式 2.通过ServletRequest 获取

在此立一个IT职业上的flag:https://github.com/Zeb-D/my-review 1万+

彻底理解非阻塞IO(NIO)

BIO和NIO是基于Linux的后端开发的重要IO模型.非阻塞IO, 由于还有一个AIO(Asynchronous I/O, 异步IO), 为了区分, NIO也被称为同步非阻塞IO,现在常用的NIO, 是NIO+IO多路复用(IO Multiplexing)的结合体, epoll还是会阻塞线程, 不是真正的非阻塞IO了.阻塞IO, 为了和NIO保持队形, 也被称为同步阻塞IO.不同操作系统对于IO模型的支持程度不同,

lic721的博客 7057

【Linux】五种IO模型 + 非阻塞IO

【Linux】非阻塞IO

tan_run的博客 1567

什么是阻塞IO和非阻塞IO

NIO是为了弥补传统IO的不足而诞生的,NIO也有缺点,因为NIO是面向缓冲区的操作,每一次的数据处理都是对缓冲区进行的,在数据处理之前必须要判断缓冲区的数据是否完整或者已经读取完毕,如果没有,假设只读取了一部分,那么对不完整的数据处理没有任何意义。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率较高。:一个应用程序执行I/O操作时,会被阻塞,直到数据准备好或操作完成。应用程序发起一个 I/O 操作后,可以继续执行其他操作,当 I/O 操作完成时会通知应用程序。

m0_60469045的博客 1046
上一篇: STL要点学习(1)--vector容器
下一篇: tcp/udp套接口缓冲区
OS技术解密
博客等级 码龄16年 3760粉丝 189原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值