socket[可读\可写\异常]3种条件的发生

目录

        • 1 下列四个条件中的任何一个满足时,socket准备好读
        • 2 下列三个条件中的任何一个满足时,socket准备好写
        • 3 socket异常条件发生


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

  1. socket接收缓冲区中已经接收的数据的字节数 socket接收缓冲区低水位标记
    注解:可以用socket选项SO_RCVLOWAT来设置低水位标记,对于TCP和UDPsocket,其缺省值为1。
  2. 套接字是一个监听套接字且已完成的连接数不为0。对于这样的套接字的accept通常不会阻塞。
  3. 连接的读这一半关闭(即:接收到对方发过来的FIN的TCP连接)。对于这样的socket的读操作不会阻塞,将返回0
  4. 有一个socket有异常错误条件待处理。对于这样的socket的读操作将不会阻塞,并且返回一个错误(-1),errno则设置成明确的错误条件。这些待处理的错误也可通过指定socket选项SO_ERROR调用getsockopt来取得并清除

2 下列三个条件中的任何一个满足时,socket准备好写

  1. socket发送缓冲区中的可用空间字节数 socket发送缓冲区低水位标记
    注解:可以用socket选项SO_SNDLOWAT来设置低水位标记,对于TCP和UDP socket,其缺省值一般是2048Bytes;
  2. 使用 非阻塞式connect的套接字 已建立连接,或者connect已经以失败告终
  3. 连接的写这一半关闭,对于这样的socket的的写操作将产生信号SIGPIPE;
    注解:shutdown(connfd, SHUT_WR); //关闭写方向
  4. 有一个socket异常错误条件待处理。对于这样的socket的写操作将不会阻塞并且返回一个错误(-1),errno则设置成明确的错误条件.这些待处理的错误也可以通过指定socket选项SO_ERROR调用getsockopt函数来取得并清除

3 socket异常条件发生

    套接字存在带外数据或者仍处于带外标记

你可能感兴趣的:(TCP/IP详解,Unix网络编程:,socket)