编程接口指南

非阻止套接字

某些应用程序需要不执行阻止的套接字。例如,服务器可能返回错误代码,不执行无法立即完成的请求。此错误可能会导致进程暂停,等待完成。创建并连接套接字之后,发出 fcntl(2) 调用(如以下示例所示)使此套接字变为非阻止套接字。


示例 7–11 设置非阻止套接字

#include <fcntl.h>

#include <sys/file.h>

...

int fileflags;

int s;

...

s = socket(AF_INET6, SOCK_STREAM, 0);

...

if (fileflags = fcntl(s, F_GETFL, 0) == -1)

  perror("fcntl F_GETFL");

  exit(1);

}

if (fcntl(s, F_SETFL, fileflags | FNDELAY) == -1)

  perror("fcntl F_SETFL, FNDELAY");

  exit(1);

}

...

在非阻塞套接字上执行 I/O 时,请检查errno.h 中的错误 EWOULDBLOCK,此错误通常在操作阻塞时发生。accept(3SOCKET)connect(3SOCKET)send(3SOCKET)recv(3SOCKET)read(2) 以及 write(2) 均可返回 EWOULDBLOCK。如果某操作(如 send(3SOCKET))不能全部完成,但是部分写入有效(如使用流套接字时),则会处理所有可用的数据。返回值是实际发送的数据量。