版权声明:guojawee https://blog.csdn.net/weixin_36750623/article/details/84946203
一、下列四个条件中的任何一个满足时,socket准备好读:
- socket接收缓冲区中已经接收的数据的字节数大于等于socket接收缓冲区低潮限度的当前值;对这样的socket的读操作不会阻塞,并返回一个大于0的值(即:准备好读入的数据的字节数)。
注解:可以用socket选项SO_RCVLOWAT来设置此低潮限度,对于TCP和UDPsocket,其缺省值为1。 - socket是一个用于监听的socket,并且已经完成的连接数为非0.这样的socket处于可读状态,是因为socket收到了对方的connect请求,执行了三次握手的第一步:对方发送SYN请求过来,使监听socket处于可读状态;正常情况下,这样的socket上的accept操作不会阻塞;
- 连接的读这一半关闭(即:接收到对方发过来的FIN的TCP连接)。对于这样的socket的读操作将不阻塞,并且返回0(即:文件结束符,FIN包体长度为0字节);
- 有一个socket有异常错误条件待处理。对于这样的socket的读操作将不会阻塞,并且返回一个错误(-1),errno则设置成明确的错误条件.这些待处理的错误也可通过指定socket选项SO_ERROR调用getsockopt来取得并清除;
二、下列三个条件中的任何一个满足时,socket准备好写:
- socket发送缓冲区中的可用空间字节数大于等于socket发送缓冲区低潮限度的当前值,且(i):socket已连接(TCP socket),或者(ii):socket不要求连接(如:UDP socket).这意味着,如果将这样的socket设置为非阻塞模式,写操作将不会阻塞,并且返回一个正值(如:由传输层接收的字节数).可以用socket选项SO_SNDLOWAT来设置此低潮限度,对于TCP和UDP socket,其缺省值一般是2048Bytes;
- 连接的写这一半关闭.对于这样的socket的的写操作将产生信号SIGPIPE;
- 有一个socket异常错误条件待处理.对于这样的socket的写操作将不会阻塞并且返回一个错误(-1),errno则设置成明确的错误条件.这些待处理的错误也可以通过指定socket选项SO_ERROR调用getsockopt函数来取得并清除;
- 使用非阻塞式connect的套接字已建立连接,或者connect已经以失败告终
连接的读这一半关闭,指的是A端TCP调用shutdown来关闭A的读,而不是B端关闭读导致A端可以读
连接的写这一半关闭,指的是A端TCP调用shutdown来关闭A的写,而不是B端关闭写导致A端可以写