一、网络编程四种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()返回成功
-> 没有人连接ÿ