C 为什么读取非阻塞套接字会返回错误状态代码
成功读取设置为非阻塞的套接字后,该套接字将暂时不可用。第一次读取调用已接收到所有数据,但错误返回值持续约5秒。之后,read返回0,套接字再次可用 为什么套接字首先返回错误 设置非阻塞插座:C 为什么读取非阻塞套接字会返回错误状态代码,c,file-descriptor,C,File Descriptor,成功读取设置为非阻塞的套接字后,该套接字将暂时不可用。第一次读取调用已接收到所有数据,但错误返回值持续约5秒。之后,read返回0,套接字再次可用 为什么套接字首先返回错误 设置非阻塞插座: /* Non blocking */ int flags = fcntl(sockfd, F_GETFL, 0); fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); 阅读并打印: result = read(sockfd, response + bytes_read,
/* Non blocking */
int flags = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
阅读并打印:
result = read(sockfd, response + bytes_read, RESPONSE_SIZE - bytes_read);
printf("%d | %d | %s\n", (int)result, errno, strerror(errno));
printf("%d | %d | %d | %d | %d | %d | %d | %d \n",
EAGAIN, EWOULDBLOCK, EBADF, EFAULT, EINTR, EINVAL, EIO, EISDIR);
其结果是:
152 | 115 | Operation now in progress
11 | 11 | 9 | 14 | 4 | 22 | 5 | 21
-1 | 11 | Resource temporarily unavailable
11 | 11 | 9 | 14 | 4 | 22 | 5 | 21
当套接字设置为非阻塞时,如果没有任何内容可读取,则读取函数将返回-1,并将errno设置为EAGAIN或ewoodblock。这就是为什么你知道没有什么可读的,在这一点上,你可以在再试之前做其他事情
如果读取返回0,则表示文件结尾被命中,或者对于发生关闭的套接字。如果FIFO或套接字类型的非阻塞文件中没有可用数据,则读取将失败,返回-1,并将errno设置为ewoodblock。此errno代码的别名是EAGAIN,它指示您在输入更多数据后稍后重试 套接字上读取的0返回值表示存在文件结束条件,这意味着对于套接字来说,发生了关闭 阅读2: 零表示文件结束 在出现错误时,返回-1,并正确设置errno
即使是非阻塞的,获取数据失败也是一个错误,这就是为什么在errno中获取eWoldBlock并返回-1。