socket 可读、可写

版权声明:guojawee https://blog.csdn.net/weixin_36750623/article/details/84946203

一、下列四个条件中的任何一个满足时,socket准备好读:

  1. socket接收缓冲区中已经接收的数据的字节数大于等于socket接收缓冲区低潮限度的当前值;对这样的socket的读操作不会阻塞,并返回一个大于0的值(即:准备好读入的数据的字节数)。
    注解:可以用socket选项SO_RCVLOWAT来设置此低潮限度,对于TCP和UDPsocket,其缺省值为1。
  2. socket是一个用于监听的socket,并且已经完成的连接数为非0.这样的socket处于可读状态,是因为socket收到了对方的connect请求,执行了三次握手的第一步:对方发送SYN请求过来,使监听socket处于可读状态;正常情况下,这样的socket上的accept操作不会阻塞;
  3. 连接的读这一半关闭(即:接收到对方发过来的FIN的TCP连接)。对于这样的socket的读操作将不阻塞,并且返回0(即:文件结束符,FIN包体长度为0字节);
  4. 有一个socket有异常错误条件待处理。对于这样的socket的读操作将不会阻塞,并且返回一个错误(-1),errno则设置成明确的错误条件.这些待处理的错误也可通过指定socket选项SO_ERROR调用getsockopt来取得并清除;

二、下列三个条件中的任何一个满足时,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函数来取得并清除;
  4. 使用非阻塞式connect的套接字已建立连接,或者connect已经以失败告终

连接的读这一半关闭,指的是A端TCP调用shutdown来关闭A的读,而不是B端关闭读导致A端可以读

连接的写这一半关闭,指的是A端TCP调用shutdown来关闭A的写,而不是B端关闭写导致A端可以写

猜你喜欢

转载自blog.csdn.net/weixin_36750623/article/details/84946203