我用socket()
+ POLLIN poll()
+ recv()
+ send()
编写了一个小型TCP服务器,但我不知道何时发布使用 POLLOUT 轮询或选择writefds
来轮询可写事件。
有人能举例说明 POLLOUT 的真实用途吗?
答案 0 :(得分:18)
通常的模式是使用poll()
的非阻塞文件描述符,如下所示:
poll()
时,
POLLIN
,因为您始终有兴趣阅读套接字的另一端发送给您的内容。
POLLOUT
。poll()
返回后,如果表明数据可供阅读,
poll()
返回时,如果它指示套接字是可写的,
POLLOUT
POLLOUT
。POLLOUT
,只有在剩下一些数据的情况下。POLLOUT
。 (这种选择通常更容易编程,因为您只需要处理在循环中的一个位置写入数据,但另一方面它会延迟写入数据直到下一次循环。)答案 1 :(得分:0)
从nginx来源,我发现:
如果有一些数据需要发送,nginx会尝试使用系统调用(也许是writev)发送它。但是,如果nginx不能一次发送总数据,它将在pollfd上设置POLLOUT,如果使用poll事件,则等待可写事件。获取可写事件时,nginx将发送左侧数据。
当nginx尝试响应大型静态文件
时,很容易重现这种情况答案 2 :(得分:0)
使用带有gcc的c ++ 98,使用Raspberry PI 3,Debian。 。
在Acceptor / Connector模式和Reactor / Proactor / ACT模式的实现中,我按照以下顺序定期使用POLLOUT:
在大多数情况下,connect返回-1。由于非阻塞文件描述符,这很可能。然后我检查结果代码。
如果它是EINPROGRESS,我在反应堆中注册一个事件处理程序(使用ppoll或epoll)和POLLOUT。最终完成连接后,poll将返回POLLOUT设置。
然后我创建一个新的TcpConnection类并进行通信。