目标是在不阻塞的情况下从套接字读取数据。Linux手册页说:
接收调用通常会返回任何可用的数据,直到请求的数量,而不是等待接收请求的全部数量。
这是否意味着在使用/ /轮询套接字描述符后我不必将MSG_DONTWAIT
标志传递给?recv()
select()
poll()
epoll()
recv
/的行为read
取决于套接字本身的特性。如果套接字被标记为非阻塞,这些调用应该立即返回EAGAIN
/EWOULDBLOCK
而不是阻塞进程。
套接字可以在读取之前标记为非阻塞,通常通过fcntl
或ioctl
。
该手册的摘录内容是,基本上,不需要对阻塞和非阻塞套接字进行读取来填充所提供的整个缓冲区。这就是为什么检查recv
/read
调用的结果很重要,以便了解缓冲区中有多少包含实际数据以及有多少是垃圾。
select
将阻塞套接字与 IO 轮询调用(例如/ poll
/ )结合使用根本不是一个好主意epoll
。即使轮询调用指示特定套接字已准备好读取,阻塞套接字有时仍会阻塞。