2

目标是在不阻塞的情况下从套接字读取数据。Linux手册页说:

接收调用通常会返回任何可用的数据,直到请求的数量,而不是等待接收请求的全部数量。

这是否意味着在使用/ /轮询套接字描述符后我不必将MSG_DONTWAIT标志传递给?recv()select()poll()epoll()

4

1 回答 1

4

recv/的行为read取决于套接字本身的特性。如果套接字被标记为非阻塞,这些调用应该立即返回EAGAIN/EWOULDBLOCK而不是阻塞进程。

套接字可以在读取之前标记为非阻塞,通常通过fcntlioctl

该手册的摘录内容是,基本上,不需要对阻塞和非阻塞套接字进行读取来填充所提供的整个缓冲区。这就是为什么检查recv/read调用的结果很重要,以便了解缓冲区中有多少包含实际数据以及有多少是垃圾。

select将阻塞套接字与 IO 轮询调用(例如/ poll/ )结合使用根本不是一个好主意epoll。即使轮询调用指示特定套接字已准备好读取,阻塞套接字有时仍会阻塞。

于 2013-02-28T13:06:58.177 回答