内容纲要
⚠️ 基础概念
I/O 多路复用
I/O 多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。
注意 ↓
通常在 I/O 多路复用中(如 epoll),socket 需要设置为 no-blocking 模式,不然会出现问题 ↓
🌰你的「读 fd」需要读取 200 Byte 的数据才会返回,但是发送数据方只发送了 199 Byte,于是你的「读 fd」就一直处于阻塞状态,并最终导致 epoll 处于被阻塞状态?
epoll
select
工作流程(开发)
- 准备一个数组,用来存放需要监视的 socket fd
- 调用 select
- 如果数组中的 socket 都没有数据:进入阻塞状态,直到有 socket 接收到数据,进程被唤醒
- 如果有数据则跳转 → 3
- select 返回
- 遍历数组中所有 fd:通过 FD_ISSET 判断哪个 scoket 接收到数据
- 后续处理