I/O模型:
1. 阻塞式I/O模型
2. 非阻塞式I/O模型:使用fcntl将套接字设置成非阻塞;然后轮询读取数据,这样会耗费大量CPU时间;
3. I/O复用模型:阻塞在select上;
4. 信号驱动式I/O模型:
5. 异步I/O模型:aio_read,信号直到数据已复制到应用进程缓冲区才产生
select:
select的最后一个时间参数:
1. 为空时表示永远等下去;
2. 为具体非0时间时表示不超过该时间返回;
3. 结构体中秒和微秒都为0表示不等待,即轮询;
select的第一个参数是指的个数,它是待测试的最大描述符加1,因为描述符是从0开始的,它的最大值由FD_SETSIZE指定,如果要增大描述符集的大小,必须先增大FD_SETSIZE的值,再重新编译内核;
select每次重新调用时都要再次把所有描述符集内所关心的位置置1,因为2,3,4个参数都是值-结果参数,函数返回时会被修改为就绪的描述符集;
准备好读:
1. 套接字接收缓冲区中数据大于等于SO_RCVLOWAT标记的大小;
2. 收到FIN的TCP连接;read返回0;
3. 如果是监听套接字,那么已完成连接数不为0;
4. 套接字有错误待处理;read返回-1,错误码通过errno获取或者SO_ERROR套接字选项获取并清除
准备好写:
1. 套接字发送缓冲区中可用空间大于等于SO_SNDLOWAT标记的大小;
2. 该连接的写关闭,write会产生SIGPIPE信号;
3. 非阻塞的connect的套接字已建立连接,或者失败;
4. 套接字有错误待处理;write返回-1,错误码通过errno获取或者SO_ERROR套接字选项获取并清除。
备注:
SO_RCVLOWAT对于TCP和UDP而言,其默认值为1;
SNDLOWAT对于TCP和UDP而言,其默认值为2048;
getsockopt返回的整数值就是该套接字待处理错误,SO_ERROR随后由内核复位为0;
参考:
《UNIX Network ProgrammingVolume 1, Third Edition: TheSockets Networking API》
原文地址:http://blog.csdn.net/junjun150013652/article/details/38060469