1 下列四个条件中的任何一个满足时,socket准备好读
- socket接收缓冲区中已经接收的数据的字节数 ≥ socket接收缓冲区低水位标记
注解:可以用socket选项SO_RCVLOWAT来设置低水位标记,对于TCP和UDPsocket,其缺省值为1。 - 套接字是一个
监听
套接字且已完成的连接数不为0
。对于这样的套接字的accept通常不会阻塞。 - 连接的读这一半关闭(即:接收到对方发过来的
FIN的TCP连接
)。对于这样的socket的读操作不会阻塞,将返回0 - 有一个socket有
异常错误
条件待处理。对于这样的socket的读操作将不会阻塞,并且返回一个错误(-1),errno则设置成明确的错误条件。这些待处理的错误也可通过指定socket选项SO_ERROR调用getsockopt来取得并清除
2 下列三个条件中的任何一个满足时,socket准备好写
- socket发送缓冲区中的可用空间字节数 ≥ socket发送缓冲区低水位标记
注解:可以用socket选项SO_SNDLOWAT来设置低水位标记,对于TCP和UDP socket,其缺省值一般是2048Bytes; - 使用
非阻塞式connect的套接字
已建立连接,或者connect已经以失败告终 - 连接的
写这一半关闭
,对于这样的socket的的写操作将产生信号SIGPIPE;
注解:shutdown(connfd,SHUT_WR
); //关闭写方向 - 有一个socket
异常错误
条件待处理。对于这样的socket的写操作将不会阻塞并且返回一个错误(-1),errno则设置成明确的错误条件.这些待处理的错误也可以通过指定socket选项SO_ERROR调用getsockopt函数来取得并清除
3 socket异常条件发生
套接字存在带外数据或者仍处于带外标记