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

时间:2019-07-03 16:39:14

标签: c file-descriptor

成功读取设置为非阻塞的套接字后,该套接字暂时不可用。第一次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 

2 个答案:

答案 0 :(得分:4)

当套接字被设置为非阻塞套接字时,如果没有内容可读取,read函数将返回-1并将errno设置为EAGAIN或{{1} }。这样一来,您就知道没有什么可阅读的了,这时您可以做其他事情,然后再试一次。

如果EWOULDBLOCK返回0,则表示文件末尾被命中,或者套接字发生关闭。

答案 1 :(得分:2)

如果FIFO或套接字类型的非阻塞文件中没有可用数据,则读取将以-1失败,并将errno设置为foreach ($movimentos['CodProduto'] as $index => $value) { echo $index } 。此EWOULDBLOCK代码的别名是errno,它指示您重试(稍后,在输入更多数据之后)。

套接字上EAGAIN返回的0返回值表示文件结束条件(对于套接字,这意味着发生了关闭)。

从read(2):

  

(零表示文件结尾)

     

...

     

错误时,返回-1,并正确设置errno。