当前位置:网站首页>socket阻塞和非阻塞模式
socket阻塞和非阻塞模式
2022-06-27 12:17:00 【xiongsiyu979】
socket阻塞和非阻塞模式
本文讨论Linux下的socket套接字
一、同步、异步阻塞和非阻塞
- 同步:主动请求并等待IO操作完成的方式
- 异步:主动请求数据后,可以去处理其它任务,随后等待IO操作完毕的通知
- 阻塞:线程持续等待资源中数据准备完成,直到返回响应结果
- 非阻塞:线程直接返回结果,不会持续等待资源准备数据结束后才响应结果
总结:
- 同步与异步是指IO操作,同步是线程等待IO的完成,异步是IO完成时线程会收到通知
- 阻塞与非阻塞是指线程,阻塞可能发生在IO期间,也可能发生在IO之前
例如,对于一个简单的服务器程序(socket、bind、listen、accept),我们通常会说程序会阻塞在accept()处,而accept()函数的操作是同步的
二、什么是socket阻塞/非阻塞模式?
1) 建立连接 connect
阻塞方式下,connect首先发送SYN请求到服务器,当客户端收到服务器返回的SYN的确认时,则connect返回,否则的话一直阻塞。
非阻塞方式,connect将启用TCP协议的三次握手,但是connect函数并不等待连接建立好才返回,而是立即返回,返回的错误码为EINPROGRESS,表示正在进行某种过程。
2)接收连接 accept
- 阻塞模式下调用accept()函数,没有新连接时,进程会进入睡眠状态,直到有可用的连接,才返回。
- 非阻塞模式下调用accept()函数立即返回,有连接返回客户端套接字描述符。没有新连接时,将返回EWOULDBLOCK错误码,表示本来应该阻塞。
3)读写操作 read/write
- 当读写缓冲区被填满后,阻塞模式下程序会阻塞在read/write,而非阻塞模式时read/write会直接返回错误码
三、如何设置socket阻塞/非阻塞模式?
- socket()函数创建的socket默认是阻塞的
- socket()函数原型:
int socket(int domain, int type, int protocol);
/*1.domain:协议域,又称协议族,它决定了socket的地址类型 * 2.type:指定socket类型,它与protocol对应 * 3.protocol:指定传输协议,如IPPROTO_TCP指定传输协议为TCP,IPPTOTO_UDP指定传输协议为UDP,当protocol为0时,会自动选择type类型对应的默认协议 */
- 将socket设置为非阻塞模式有两种办法:
- 在创建socket时,指定创建的socket为非阻塞(type参数中设置SOCK_NONBLOCK标志)
int sockfd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, IPPROTO_TCP);
- 使用fcntl()和ioctl()函数设置socket为非阻塞模式
fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFL, 0) | O_NONBLOCK);
ioctl(sockfd, FIONBIO, 1); //1:非阻塞 0:阻塞
边栏推荐
猜你喜欢
Interview shock 60: what will cause MySQL index invalidation?
[tcapulusdb knowledge base] Introduction to tcapulusdb tcapsvrmgr tool (II)
convn-N 维卷积
带你认识图数据库性能和场景测试利器LDBC SNB
Comment modifier Node Fichiers dans les modules
PyCharm汉化
秒云荣获《2022爱分析 · IT运维厂商全景报告》智能运维AIOps市场代表厂商
How to find the movie and TV clips with the same lines? These 8 movies search for artifact, and find the corresponding segment in one line
Private dry goods sharing: how to implement platform in Enterprise Architecture
esp32s3 IPERF例程测试 esp32s3吞吐量测试
随机推荐
alibaba jarslink
convn-N 维卷积
全球最快下载工具 XDM
word文本框换页
居家办公被催之后才明白的时间管理
threejs的环境光+点光源+平行光源+球面光 以及hepler理解+阴影()
log4j. Detailed configuration of properties
Nifi from introduction to practice (nanny level tutorial) - identity authentication
esp32s3 IPERF例程测试 esp32s3吞吐量测试
uni-app 使用escook/request-miniprogram插件发请求说明
Dm8: Dameng database - lock timeout
C # WPF realizes undo redo function
Interview shock 60: what will cause MySQL index invalidation?
自学ADT和OOP
MySQL high level statements (I)
Mybaitis generator details
How to participate in openharmony code contribution
. Net6 access skywalking link tracking complete process
First encounter with dynamic programming
栈的计算(入栈出栈顺序是否合法)-代码