Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么读取非阻塞套接字会返回错误状态代码_C_File Descriptor - Fatal编程技术网

C 为什么读取非阻塞套接字会返回错误状态代码

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,

成功读取设置为非阻塞的套接字后,该套接字将暂时不可用。第一次读取调用已接收到所有数据,但错误返回值持续约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, 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。