为什么读取非阻塞套接字 return 错误状态代码
Why does reading a non-blocking socket return an error status code
成功读取设置为非阻塞的套接字后,套接字暂时不可用。第一次 read
调用已收到所有数据,但错误 return 值持续约 5 秒。之后 read
returns 0 并且套接字再次可用。
为什么套接字 return 首先出错?
设置非阻塞套接字:
/* 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
当套接字设置为 non-blocking 时,如果没有任何内容可读取,read
函数将 return -1 并将 errno
设置为 EAGAIN
或 EWOULDBLOCK
。这就是你知道没有什么可读的方式,此时你可以在重试之前做其他事情。
如果 read
returns 0,这意味着 end-of-file 被击中,或者对于发生关闭的套接字。
如果 FIFO 或套接字类型的 non-blocking 文件中没有可用数据,读取将失败并返回 -1 并将 errno 设置为 EWOULDBLOCK
。此 errno
代码的别名是 EAGAIN
,它会提示您重试(稍后,在输入更多数据后)。
来自套接字上 read
的 0
return 值表示 end-of-file 条件(这意味着,对于套接字,发生了关闭).
来自阅读(2):
(zero indicates end of file)
...
On error, -1 is returned, and errno is set appropriately.
成功读取设置为非阻塞的套接字后,套接字暂时不可用。第一次 read
调用已收到所有数据,但错误 return 值持续约 5 秒。之后 read
returns 0 并且套接字再次可用。
为什么套接字 return 首先出错?
设置非阻塞套接字:
/* 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
当套接字设置为 non-blocking 时,如果没有任何内容可读取,read
函数将 return -1 并将 errno
设置为 EAGAIN
或 EWOULDBLOCK
。这就是你知道没有什么可读的方式,此时你可以在重试之前做其他事情。
如果 read
returns 0,这意味着 end-of-file 被击中,或者对于发生关闭的套接字。
如果 FIFO 或套接字类型的 non-blocking 文件中没有可用数据,读取将失败并返回 -1 并将 errno 设置为 EWOULDBLOCK
。此 errno
代码的别名是 EAGAIN
,它会提示您重试(稍后,在输入更多数据后)。
来自套接字上 read
的 0
return 值表示 end-of-file 条件(这意味着,对于套接字,发生了关闭).
来自阅读(2):
(zero indicates end of file)
...
On error, -1 is returned, and errno is set appropriately.