1.什么情况下使用IO复用 1.客户端处理多个描述符; 2.客户端处理多个套接字; 3.TCP服务器既要处理监听套接字,又要处理连接套接字; 4.一个服务器既要处理TCP,又要处理UDP; 5.一个服务器要处理多个服务或者多个协议; 2.I/O模型 阻塞式IO(默认情况下,所有套接字都为阻塞的); 非阻塞式IO(当所有IO请求操作非得把本进程投入睡眠才能完成时,不要把本进程投入睡眠,轮询); IO复用(阻塞在select,poll的某一个只上,而不是阻塞在真正的IO系统调用之上,需要2个系统调用); 信号驱动IO(通过sigaction安装一个信号处理函数,主循环继续,数据准备好时,内核为该进程产生一个SIGIO信号,自己在信号处理函数中复制数据); 异步IO(告诉内核启动某个操作,并在内核在整个操作完成之后通知我们。 与信号驱动IO的区别在于,信号驱动IO是由内核告知我们何时启动一个IO操作。 而异步IO是由内核通知我们IO操作何时完成,即信号在数据被复制到应用缓冲区时产生); 3.描述符准备就绪的条件 一个套接字准备好读: 1.该套接字接收缓冲区的数据字节大于套接字接收缓冲区低水位; 2.该连接的读半部关闭,对这样的套接字的读操作不阻塞返回0; 3.该套接字是一个监听套接字且已经完成的连接数不为0; 4.其上有一个套接字错误待处理; 一个套接字准备好写: 1.该套接字发送缓冲区中可用空间大于套接字发送缓冲区低水位; 2.该连接写半部关闭; 3.使用非阻塞connect的套接字已经建立连接,或者connect已失败告终; 4.该套接字有错误待处理; 4.shutdown 与 close 区别 1.close 只是把计数器 -1,直到0时才真正关闭; 2.close 终止两个方向上的数据传送,shutdown 可以只终止一个方向; 5.避免拒绝服务型攻击 当服务器处理多个客户时,它绝对不能阻塞于只与某个单个客户相关的函数调用。 1.使用非阻塞IO; 2.让每个客户由单独的控制线程提供服务; 3.对IO操作设置一个超时;
1.概述
2.I/O模型
3.select 函数
4.str_cli 函数
5.批量输入
6.shutdown 函数
7.str_cli 函数
8. TCP 回射服务器程序
9.pselect 函数
10.poll 函数
11.TCP 回射服务器程序