网络编程中,咱们常常讨论等待某个描述符准备好I/O(读/写)或者等待其上发生一个待处理的异常条件。尽管可读性和可写性对于普通文件这样的描述符显而易见,然而对于引发诸如select返回套接字“就绪”的条件咱们必须讨论的更明确些。编程
a)该套接字接受缓冲区中的数据字节数大于等于套接字接受缓冲区低水位标记的当前大小。对这样的套接字执行读操做不会阻塞并将返回一个大于0的值(也网络
就是返回准备好读入的数据)。咱们能够使用SO_RCVLOWAT套接字选项设置该套接字的低水位标记。对于tcp和udp套接字而言,其默认值为1。
tcp
b)该套接字的读半部关闭(也就是接受了FIN的tcp链接)。对这样的套接字的读操做将不阻塞并返回0.(也就是返回EOF)get
c)该套接字是一个监听套接字且已完成的链接数不为0。对这样的套接字的accept一般不阻塞。(后边可会发文介绍阻塞accept的一种时序条件)网络编程
d)其上有一个套接字错误待处理。对这样的套接字的读操做将不阻塞并返回-1(也就是返回一个错误),同时把errno设置成确切的错误条件。这样待处理错误(pending error)也能够经过指定SO_ERROR套接字选项调用getsockopt获取并清除。select
a)该套接字发送缓冲区中的可用空间字节数大于等于套接字发送缓冲区低水位标记的当前大小,而且或者该套接字已链接,或者该套接字不须要链接(如udp套接udp
字)。这意味着若是咱们把这样的套接字设置成非阻塞,写操做将不阻塞并返回一个正值(例如由传输层接受的字节数)。咱们能够使用SO_SNDLOWAT套接字选项来设error
置该套接字的低水位标记。对于tcp和udp而言,其默认值一般为2048。数据
b)该链接的写半部关闭。对这样的套接字的写操做将产生SIGPIPE信号。异常
c) 使用非阻塞connect的套接字已创建链接,或者connect已经以失败了结。
d) 其上有一个套接字错误待处理。对这样的套接字的写操做将不阻塞并返回-1(也就是返回一个错误),同时把errno设置成确切的错误条件。这些待处理的错
误也能够经过指定SO_ERROR套接字选项调用getsockopt获取并清除。
注意:当某个套接字上发生错误时,它将select标记为便可读又可写。