非阻塞IO,多路复用

本文详细介绍了网络编程中的两种IO模型——非阻塞IO和多路复用。首先解释了阻塞IO和非阻塞IO的工作原理,通过fcntl()函数设置文件描述符的非阻塞属性,展示了非阻塞IO在处理连接请求时的改变。接着,讨论了多路复用的概念,如何使用select()函数监听多个文件描述符,以及如何在服务器端和客户端实现基于多路复用的通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、网络编程四种IO模型。
1、什么是IO模型?
网络编程对于数据输出输入方法: 阻塞IO,非阻塞IO,多路复用,信号驱动。

2、这几种IO模型原理是如何?
1)阻塞IO: 一直阻塞等待某一个套接字的数据到达,如果有数据,则读取并返回,如果无数据,就会一直等待。
read(fd);
recv(fd);
accept(sockfd);
以上的例子,在过去,我们都会觉得是函数阻塞,例如read函数,accept函数阻塞,但是这样想是错误,因为真正阻塞的是套接字/文件描述符,并不是函数本身具有阻塞的属性。

因为fd是文件描述符  -> fd默认就是阻塞属性  -> read(fd)  -> 阻塞

2)非阻塞IO:读取一个套接字数据,如果有数据,就会读取返回,如果没有数据,直接返回。
因为fd是文件描述符  -> fd默认就是阻塞属性  -> 添加非阻塞属性给fd  -> read(fd)  -> 非阻塞读取。

3)

4)

二、非阻塞IO模型。
1、如果要使用非阻塞IO,思路是如何?
1)先创建一个文件描述符/套接字   -> 默认都是阻塞属性。
2)设置非阻塞的属性给文件描述符  -> 这时候,文件描述符就是非阻塞的。
3)再调用read()/accept()/recv()去处理这个文件描述符时,就会非阻塞。

2、如何设置非阻塞属性给文件描述符?  ->  fcntl()  -> man 2 fcntl

头文件:
#include <unistd.h>
#include <fcntl.h>

原型:
    int fcntl(int fd, int cmd, ... /* arg */ );

参数:
    fd: 需要设置属性的文件描述符
    cmd:
         F_GETFL (void)  -> void代表第三个参数不需要填
         Get the file access mode and the file status flags; arg is ignored.
         //获取当前文件描述符的属性


         F_SETFL (int)   -> int代表后面那个参数要填
         Set the file status flags to the value specified by arg.

         O_NONBLOCK   -> 非阻塞属性

返回值:
    成功:
        F_GETFL    返回文件的属性
        F_SETFL    返回0
            
    失败:
        -1

   例题1: 设置非阻塞属性给监听套接字,看看这个套接字还会不会阻塞等待客户端连接?

   listen(sockfd);
   accept(sockfd);  -> 阻塞   -> 有人连接,accept()返回
                 没有人连接,就会一直等待

   listen(sockfd);  
   设置非阻塞属性给sockfd  
   accept(sockfd);  -> 非阻塞  -> 有人连接,accept()返回成功
                   -> 没有人连接ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值