栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

socket阻塞和非阻塞模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

socket阻塞和非阻塞模式

socket阻塞和非阻塞模式

本文讨论Linux下的socket套接字

一、同步、异步阻塞和非阻塞
  1. 同步:主动请求并等待IO操作完成的方式
  2. 异步:主动请求数据后,可以去处理其它任务,随后等待IO操作完毕的通知
  3. 阻塞:线程持续等待资源中数据准备完成,直到返回响应结果
  4. 非阻塞:线程直接返回结果,不会持续等待资源准备数据结束后才响应结果

总结:

  • 同步与异步是指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);


  • 将socket设置为非阻塞模式有两种办法:
  1. 在创建socket时,指定创建的socket为非阻塞(type参数中设置SOCK_NONBLOCK标志)
int sockfd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, IPPROTO_TCP);
  1. 使用fcntl()和ioctl()函数设置socket为非阻塞模式
fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFL, 0) | O_NONBLOCK);  
   
ioctl(sockfd, FIONBIO, 1);  //1:非阻塞 0:阻塞 
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/996217.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号