Fla*_*ash 3 c sockets select posix network-programming
背景:我知道我不能直接打电话accept()
,select()
并假设它会起作用,因为客户端可能在select()
返回后断开连接,即使select()
告诉我套接字已准备就绪accept()
.相反,我需要设置套接字O_NONBLOCK
,然后测试EAGAIN/EWOULDBLOCK
我何时调用accept()
- 见下文.
问题:我需要用select()
/ 做同样的事情recv()
吗?如果select()
告诉我套接字已准备好读取,我是否可以调用recv()
并保证它不会阻塞(或报告EAGAIN/EWOULDBLOCK
它是否为非阻塞套接字)?
这是我用于accept()
案例的代码:
while(true) {
fd_ready = select_for_read(listen_fds, 2);
fd_client = accept(fd_ready, (struct sockaddr *)&client_addr, &client_addr_len);
if (fd_client == -1) {
if (errno == EAGAIN || errno == EWOULDBLOCK) {
continue;
} else {
exit_with_error("Error accepting connection from client");
}
}
break;
}
Run Code Online (Sandbox Code Playgroud)
(select_for_read
获取一个文件描述符和块的数组,直到一个准备好使用select()
.)