目标是在不阻塞的情况下从套接字读取数据。 Linux 手册页说:
The receive calls normally return any data available, up to the requested amount, rather than waiting for receipt of the full amount requested.
这是否意味着在使用 select()
轮询套接字描述符后我不必将 MSG_DONTWAIT
标志传递给 recv()
/poll()
/epoll()
?
最佳答案
recv
/read
的行为取决于套接字本身的特性。如果套接字被标记为非阻塞,这些调用应立即返回 EAGAIN
/EWOULDBLOCK
而不是阻塞进程。
在读取套接字之前,可以将套接字标记为非阻塞,通常通过 fcntl
或 ioctl
。
手册中的这段摘录说的是,基本上,阻塞和非阻塞套接字上的读取不需要填充所提供的整个缓冲区。这就是为什么检查 recv
/read
调用的结果非常重要,以便了解缓冲区中有多少包含实际数据以及有多少是垃圾。
将阻塞套接字与 IO 轮询调用(例如 select
/poll
/epoll
结合使用根本不是一个好主意。即使轮询调用表明特定套接字已准备好读取,阻塞套接字有时仍会阻塞。
关于c - 当recv阻塞时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15136308/