非阻塞式I/O
1.非阻塞读和写:str_cli函数
①把描述符设置为非阻塞②初始化缓冲区指针③主循环:准备调用select④指定关注的描述符⑤调用select ⑥从标准输入read⑦处理非阻塞错误⑧read返回EOF⑨read返回数据
2.非阻塞式connect
当在一个非阻塞的TCP套接字上调用connect时,connect立即返回一个错误,不过已经发生的TCP三次握手继续进行。
非阻塞的connect有三个用途:
①我们可以把三次握手叠加到其他处理上
②我们可以使用这个技术同时建立多个连接
③既然select等待连接的简历,我们可以给select指定一个时间限制,使我们能够缩短select的超时。
3.非阻塞connect:时间获取客户程序
设置套接字为非阻塞,调用fcntl把套接字设置为非阻塞
在其他处理上迭合连接建立
检查连接是否即建立,如果非阻塞返回0,说明建立
调用select
处理超时,如果select返回0说明超时发生,于是我们返回ETIMEOUT给调用者。我们还要关闭套接字,防止三次握手继续下去。
检查可读或可写条件
关闭非阻塞状态并返回
被中断的connect
4.非阻塞connect:Web客户程序
定义file结构
定义全局变量和函数原型
处理命令参数
读取主页
初始化全局变量
建立与服务器的连接
发送HTTP命令道服务器,读取应答
创建套接字,设置为非阻塞
发起非阻塞
处理连接建立完成情况
构造命令并发送
设置标志
可能的话发起另一个连接
select:等待事件发生
处理所有就绪的描述符
检查描述符是否有数据
同时连接的性能
5.非阻塞accept
小结