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