现在的位置: 首页 > 综合 > 正文

UNIX网络编程中的描述字就绪条件

2018年03月18日 ⁄ 综合 ⁄ 共 918字 ⁄ 字号 评论关闭

我们一直在讨论等待某个描述字准备好 I/O (读或写)或是其上发生一个待处理的异常条件(带外数据)。尽管可读性和可写性对于普通文件这样的描述字显而易见,然而对于引起 select 返回套接口就绪的条件要更为复杂一些。

1、下列四个条件中的任何一个满足时,一个套接口准备好

  • 该套接口接收缓冲区中的数据字节数大于等于套接口接收缓冲区低潮标记的当前大小。对这样的套接口的读操作将不阻塞并返回一个大于0 的值(也就是返回准备好读入的数据字节数)。可以使用 SO_RCVLOWAT 套接口选项设置该套接口的低潮标记。对于 TCP 和 UDP 套接口而言,其缺省值为 1。

  • 该连接的读这一半关闭(也就是接收了 FIN 的 TCP 连接)。对这样的套接口的读操作将不阻塞并返回 0(也就是返回 EOF )。

  • 该套接口是一个监听套接口并且已完成的连接数不为 0。对这样的套接口的 accept 通常不会阻塞。

  • 套接口上有一个套接口错误待处理。对这样的套接口的读操作将不阻塞并返回 -1 (也就是返回一个错误),同时把 errno 设置成确切的错误条件。这些待处理的错误( pending error)也可以通过指定 SO_ERROR 套接口选项调用 getsockopt 获取并清除。

2、下列四个条件中的任何一个满足时,一个套接口准备好写:

  • 该套接口发送缓冲区中的可用空间字节数大于或等于套接口发送缓冲区低潮标记的当前大小,并且或者该套接口已连接,或者该套接口不需要连接(例如 UDP 套接口)。这意味着如果我们把这样的套接口设置成非阻塞,写操作将不阻塞并返回一个正值(例如由传输层接受的字节数)。我们可以使用 SO_SNDLOWAT 套接口选项来设置该套接口的低潮标记。对于 TCP 和 UDP 套接口而言,其缺省值通常为 2048。

  • 该连接的写这一半关闭。对这样的套接口的写操作将产生 SIGPIPE 信号。

  • 该套接口早先使用非阻塞模式 connect 以建立连接,并且连接已经异步建立,或者 connect 已经以失败告终。

  • 套接口上有一个套接口错误待处理。对这样的套接口的写操作将不阻塞并返回 -1(也就是返回一个错误),同时把 errno 设置程确切的错误条件。这些待处理的错误也可以通过指定  SO_ERROR 套接口选项调用 getsockopt 获取并清除。

抱歉!评论已关闭.