某些应用程序需要不执行阻止的套接字。例如,服务器可能返回错误代码,不执行无法立即完成的请求。此错误可能会导致进程暂停,等待完成。创建并连接套接字之后,发出 fcntl(2) 调用(如以下示例所示)使此套接字变为非阻止套接字。
#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))不能全部完成,但是部分写入有效(如使用流套接字时),则会处理所有可用的数据。返回值是实际发送的数据量。