天天看点

socket可读可写

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

  1. socket的接受缓冲区中的数据大于等于该socket的接收缓冲区低水位标记的当前的大小。对于这样的socket的读操作将不堵塞并返回一个大于0的值。我们可以用SO_RCVLOWAT 这个socket选项来设置该socket的低水位值。缺省值位1.
  2. 该连接的读这一半关闭(也就是接收了FIN的TCP连接)。对于这样的socket将不堵塞返回0.
  3. socket 是一个用于监听的socket,并且已经完成的连接数不为0。这样的socket处于可读状态,是因为socket收到了对方的connect请求,执行了三次握手的第一步;对方发送SYN请求过来,使监听socket处于可读状态。正常情况下,这样的socket上的 accept将不堵塞放回。
  4. 有一个socket有异常错误条件待处理。对于这样的socket的读操作将不堵塞,并且返回错误-1,errno则设置成明确的错误条件。这些待处理的错误也可通过socket选项SO_ERROR调用获取并清除。

socket的可写条件

二、下列三个条件中的任何一个满足时,socket处于可写状态。

  1. socket的发送缓冲区中的数据字节大于等于该socket的发送缓冲区低水位标记当前的大小。对于这样的socket的写操作将不堵塞并返回一个大于0的值(也就是可写的大小)。我们可以用SO_SNDLOWAT 这个socket选项来设置该socket的低水位标记。默认值为 2048。
  2. 该连接的写一半关闭。对于这样的socket将不堵塞返回0.
  3. 有一个socket异常错误条件待处理。对于这样的socket的写操作将不堵塞,并且返回错误-1. errno则设置成明确的错误条件。这些待处理的错误可通过socket选项SO_ERROR调用获取并清除。