Unix网络编程学习笔记——Select函数的返回条件

来源:互联网 发布:老薛主机 知乎 编辑:程序博客网 时间:2024/05/21 12:46

int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout); 

在select函数的定义中,中间三个参数用于指定我们需要内核帮助测试是否可读、可写和异常条件的描述字。

那么描述字在哪些情况下才会被认为准备好呢?


下面四个条件任何一个满足的时候套件字准备好读:

1. 套接口接受缓冲区的数据字节数大于等于套接口接受缓冲区的低潮限度当前值。对这样的套接口读操作将不阻塞并返回一个大于0的值(既准备好读入的数据量)。我们可以用套接口选项SO_RCVLOWAT来设置此低潮限度,对于TCP和UDP套接口,其缺省值为1。

2. 连接的读这一半关闭(也就是接收了FIN的TCP连接)。对这样的套接口读操作将不阻塞并返回0(记文件结束符)。

3. 套接口是一个监听的套接口且已完成的连接数为非0。正常情况下这样的套接口上的accpet不会被阻塞。

4. 有一个套接口错误待处理。对这样的套接口操作将不阻塞并返回一个错误-1,errno设置成明确的错误条件。


一下三个条件的任何一个满足时,套接口准备好写操作:

1. 套接口发送缓冲区中可用空间的字节数大于等于套接口发送缓冲区低潮限度的当前值,且或者(i)套接口已连接,或者(ii)套接口不需要连接(例如UDP套接字)。这意味着,如果我们将这样的套接口设置为非阻塞,写操作将不阻塞且返回一个正值(例如由传输层传入的字节数)。我们可以用套接口选项SO_SNDLOWAT来设置此低潮限度,对于TCP和UDP套接口其缺省值为2048.

2. 连接的写这一半关闭,对这样的套接口写操作将产生信号SIGPIPE。

3. 有一个套接口错误待处理。对这样的套接口操作写操作将不阻塞且返回一个错误-1,errno设置成明确的错误条件。这些待处理的错误也可通过指定套接口选项SO_ERROR调用getsockopt来取得并清除。


如果一个套接口存在带外数据或者仍处于带外标记,那他有异常条件待处理。


小结如下:


原创粉丝点击