套接字 I/O 方式
套接字可以设置为分块或非分块 I/O 方式。
FIONBIO ioctl 操作用于确定此方式。 设置 FIONBIO ioctl 时,会将套接字标记为非分块。 如果尝试读取并且所需数据不可用,那么套接字不会等待数据变为可用,但会立即返回 EWOULDBLOCK 错误代码。
注: EWOULDBLOCK 错误代码是使用 _BSD 定义定义的,等同于 EAGAIN 错误代码。
如果未设置 FIONBIO ioctl ,那么套接字处于分块方式。 在此方式下,如果尝试读取并且所需数据不可用,那么调用进程将等待该数据。 同样,在写入时,如果设置了 FIONBIO 并且输出队列已满,那么尝试写入会导致进程立即返回错误代码 EWOULDBLOCK。
在套接字上执行非阻塞 I/O 时,程序必须检查 EWOULDBLOCK 错误代码 (存储在 errno 全局变量中)。 当操作通常会阻塞,但它所执行的套接字被标记为非阻塞时,会发生此情况。 以下套接字子例程返回 EWOULDBLOCK 错误代码:
使用这些子例程的进程应该准备好处理 EWOULDBLOCK 错误代码。 对于非分块套接字, connect 子例程返回 EINPROGRESS 错误代码。
如果无法完全执行诸如 send 操作之类的操作,但允许部分写入 (例如,使用流套接字时) ,那么将处理可立即发送的数据,并且返回值指示实际发送的量。