堵塞与非堵塞IO模式详解

本文详细解析了阻塞和非阻塞IO模式在socket编程中的应用,包括如何设置文件和消息队列的阻塞/非阻塞模式。阻塞IO在无数据时会等待,而非阻塞则立即返回。读操作在阻塞模式下会尽可能读取数据,非阻塞模式则可能需要循环读取;写操作在阻塞模式下会尝试一次性写完,也可能因中断而需要循环写入。
摘要由CSDN通过智能技术生成
    在网络编程中对于一个网络句柄会遇到阻塞IO 和非阻塞IO 的概念, 这里对于这两种socket 先做一下说明:

阻塞IO:socket 的阻塞模式意味着必须要做完IO 操作(包括错误)才会返回。

    非阻塞IO:非阻塞模式下无论操作是否完成都会立刻返回,需要通过其他方式来判断具体操作是否成功。(对于connect,accpet操作,通过select判断,对于recv,recvfrom,send,sendto通过返回值+错误码来判断)。

    对于一个socket 是阻塞模式还是非阻塞模式的处理方法很简单,可以用fcntl来设置,参数F_GETFL获取flags,F_SETFL设置flags|O_NONBLOCK,同时,recv,send 时使用非阻塞的方式读取和发送消息,即flags设置为MSG_DONTWAIT实现。下面是用fcntl 函数将一个socket 句柄设置(非)阻塞的I/O模式:
flags = fcntl(sockfd, F_GETFL, 0);  //获取文件的flags值。
  fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);   //设置成非阻塞模式;
  flags  = fcntl(sockfd,F_GETFL,0);
  fcntl(sockfd,F_SETFL,flags&~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值