Linux网络编程:I/O复用(更新ing...)

阻塞IO操作

通常IO操作(比如readwrite)都是阻塞I/O的,当调用read时,如果没有数据收到,线程或者进程就会被挂起,直到收到数据。

Linux网络编程:I/O复用(更新ing...)_第1张图片

1. IO多路复用 

内核驱动实现 使用一个线程来检查I/O流(Socket)的就绪状态。通过记录跟踪每个I/O流(Socket)的状态,来同时管理多个I/O流 。

  • 优点:开销低
  • 缺点:编程复杂度高

1.1 Select模式

1.1.1 结构体

fd_set:描述符集合(long类型数组)

1.1.2 函数

监听描述符事件,如果描述符集合中没有就绪,等待;反之,函数返回,把描述符集合清空,并设置已经就绪的描述符(设置为1)。

int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout)
  • 参数
No. 参数 含义
1 maxfd 需要监视的最大的文件描述符值+1
2 rdset 需要检测的可读文件描述符的集合
3 wrset 需要检测的可写文件描述符的集合
4 exset 需要检测的异常文件描述符的集合
5 timeout 超时时间
  • 返回值
No. 返回值 含义
1 -1 出错
2 =0 超时
3 >0 获取到数据

1.1.3 宏定义

No. 参数 含义
1 FD_ZERO(fd_set *fdset) 清空文件描述符集
2 FD_SET(int fd,fd_set *fdset) 设置监听的描述符(把监听的描述符设置为1)
3 FD_CLR(int fd,fd_set *fdset) 清除监听的描述符(把监听的描述符设置为0)
4 FD_ISSET(int fd,fd_set *fdset) 判断描述符是否设置(判断描述符是否设置为1)
5 FD_SETSIZE 256;最大描述符个数

编码流程

  1. 定义描述符集
  2. 清空描述符集
  3. 设置指定的描述符并获取最大的描述符值+1
  4. 等待描述符就绪
  5. 判断已就绪的描述符,并做对应处理。

Linux网络编程:I/O复用(更新ing...)_第2张图片

创建描述符集合,FD_SET将需要监听的位置至为1,获取最大位置maxfdp,传入select后集合会重新清零,然后FD_ISSET判断某一位是否启用,启用后发起动作。

就绪条件

Linux网络编程:I/O复用(更新ing...)_第3张图片

例如:

Linux网络编程:I/O复用(更新ing...)_第4张图片 简单的监听集合

多路客户端链接,需要监听链接描述符

Linux网络编程:I/O复用(更新ing...)_第5张图片

Linux网络编程:I/O复用(更新ing...)_第6张图片 添加新的监听描述符(客户端socket描述符)

设置了本地输入描述符和请求链接描述符

监听到listenfd后通过accept(listenfd,NULL,NULL)获取新的客户端socket描述符,并加入描述符集合中继续监听

Linux网络编程:I/O复用(更新ing...)_第7张图片

 

 

你可能感兴趣的:(Linux,网络编程)