网络编程Socket之TCP之select概述

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


你可能感兴趣的:(socket,tcp,select)