1、
下列四个条件中的任何一个知足时,socket准备好读:
1.socket接收缓冲区中已经接收的数据的字节数大于等于socket接收缓冲区低潮限度的当前值;对这样的socket的读操做不会阻塞,并返回一个大于0的值(即:准备好读入的数据的字节数).咱们能够用socket选项SO_RCVLOWAT来设置此低潮限度,对于TCP和UDPsocket,其缺省值为1;
2.链接的读这一半关闭(即:接收到对方发过来的FIN的TCP链接).对于这样的socket的读操做将不阻塞,而且返回0(即:文件结束符,FIN包体长度为0字节);
3.socket是一个用于监听的socket,而且已经完成的链接数为非0.这样的soocket处于可读状态,是由于socket收到了对方的connect请求,执行了三次握手的第一步:对方发送SYN请求过来,使监听socket处于可读状态;正常状况下,这样的socket上的accept操做不会阻塞;
4.有一个socket有异常错误条件待处理.对于这样的socket的读操做将不会阻塞,而且返回一个错误(-1),errno则设置成明确的错误条件.这些待处理的错误也可经过指定socket选项SO_ERROR调用getsockopt来取得并清除;
2、
下列三个条件中的任何一个知足时,socket准备好写
:
1.socket发送缓冲区中的可用空间字节数大于等于socket发送缓冲区低潮限度的当前值,且(i):socket已链接(TCP socket),或者(ii):socket不要求链接(如:UDP socket).这意味着,若是咱们将这样的socket设置为非阻塞模式,写操做将不会阻塞,而且返回一个正值(如:由传输层接收的字节数).咱们能够用socket选项SO_SNDLOWAT来设置此低潮限度,对于TCP和UDP socket,其缺省值通常是2048Bytes;
2.链接的写这一半关闭.对于这样的socket的的写操做将产生信号SIGPIPE;
3.有一个socket异常错误条件待处理.对于这样的socket的写操做将不会阻塞而且返回一个错误(-1),errno则设置成明确的错误条件.这些待处理的错误也能够经过指定socket选项SO_ERROR调用getsockopt函数来取得并清除;