描述符就绪条件

Posted ravener

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了描述符就绪条件相关的知识,希望对你有一定的参考价值。

对于套接字就绪状态的判断如下:
一、满足下列四个条件中的任何一个时,一个套接字准备好读。

“监听socket”:该套接字是一个监听套接字且已完成的连接数不为0。而这样的套接字处于可读状态,是因为套接字收到了对方的connect请求,执行了三次握手的第一步:对方发送SYN请求过来,使该方监听套接字处于可读状态;通常情况下,对这样的套接字执行accept操作不会阻塞;
“已连接socket”:该套接字的接收缓冲区中的数据字节大于等于该套接字的接收缓冲区低水位标记的当前大小。对这样的套接字执行读操作不会阻塞并返回一个大于0的值(也就是返回准备好读入的数据)。可以用SO_RCVLOWAT套接字选项设置该套接字的低水位标记。对于TCP和UDP套接字而言,其缺省值为1,这意味着,默认情况下,只要缓冲区中有数据,那就是可读的。
“已连接socket”:该连接的读半部关闭(也就是接收了FIN的TCP连接)。对这样的套接字的读操作将不阻塞并返回0(也就是返回EOF),此时必须且一直会返回0;
“已连接socket”:其上有一个套接字错误待处理。对这样的套接字的读操作将不会阻塞并返回-1(即返回一个错误),同时把errno设置成确切的错误条件。这些待处理错误(pending error)也可通过指定SO_ERROR套接字选项调用getsockopt获取并清除。

二、下列四个条件中的任何一个满足时,一个套接字准备好写。

“已连接socket/UDP socket”:该套接字发送缓冲区中的可用空间字节数大于等于该套接字的发送缓冲区低水位标记的当前大小(对于TCP的已连接socket或者UDP socket均可)。对这样的套接字的写操作将不阻塞并返回一个大于0的值(也就是返回准备好写入的数据)。可以用SO_SNDLOWAT套接字选项设置该套接字的低水位标记。对于TCP和UDP套接字而言,低水位默认值为2048,发送缓冲区默认大小为8K,这意味着,默认情况下,一个套接字连接成功后,总是可写的;
“已连接socket”:该连接的写半部关闭(主动发送了FIN的TCP连接)。对这样的套接字的写操作将产生SIGPIPE信号,该信号的缺省行为是终止进程;
“已连接socket”:其上有一个套接字错误待处理。对这样的套接字的写操作将不会阻塞并且返回-1(即返回一个错误),同时把errno设置成确切的错误条件。这些待处理的错误也可以通过指定SO_ERROR套接字选项调用getsockopt函数来取得并清除;
使用非阻塞式connect的套接字已建立连接,或者connect已经以失败告终,即connect已经完成。

注意:

    由一.4、二.3 可知,当某个套接字上发生错误时,它会被select标记为既可读又可写。
    由二.1 可知,任何UDP套接字只要发送缓冲区的可用空间字节数大于等于其发送低水位标记(默认总为该关系)就总是可写的,这是因为UDP不需要连接。
    socket接受到普通数据或带外数据都会使select返回,但socket处于不同的就绪状态:前者处于可读状态,后者处于异常状态。

以上是关于描述符就绪条件的主要内容,如果未能解决你的问题,请参考以下文章

通过select监控多个描述符实现并发连接

UNP学习第六章

检查使用O_NONBLOCK打开的文件描述符是否准备就绪

jQuery文档就绪

epoll

条件片段和导航重用