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