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