我用 socket()
+ POLLIN poll()
+ recv()
写了一个小型 TCP 服务器+ send()
,但我不知道何时使用POLLOUT 轮询或选择writefds
轮询可写事件。
谁能给我一个POLLOUT的实际用法的例子?
最佳答案
通常的模式是通过 poll()
使用非阻塞文件描述符,如下所示:
- 准备好
poll()
时,- 始终设置
POLLIN
,因为您总是对读取套接字的另一端发送给您的内容感兴趣。- 除非您有大量传入数据积压,并且您故意想让另一端在发送更多数据之前等待。
- 仅当您有未完成的数据要发送到另一端时才设置
POLLOUT
。
- 始终设置
- 从
poll()
返回时,如果它指示数据可供读取,- 阅读它并用它做点什么
- 从
poll()
返回时,如果它表明套接字是可写的,- 尝试发送您未完成的数据。
- 如果你设法写完了所有这些,你就不会在下一次循环中设置
POLLOUT
- 如果您只发送了其中的一部分(或没有发送),请保留其余部分以备后用。您将在下一次循环中设置
POLLOUT
。
- 如果你设法写完了所有这些,你就不会在下一次循环中设置
- 尝试发送您未完成的数据。
- 当您有新数据要发送时(响应您读取的数据或响应某些外部事件),您有两种选择:
- 急切地尝试立即发送其中的一些内容。您可能会成功发送一个、部分或全部。和前面的情况一样,保留下一次没有写入的部分数据,并计划在下次有数据剩余时通过循环设置
POLLOUT
。 - 只需保留数据并计划在下一次循环中设置
POLLOUT
。 (这种选择通常更易于编程,因为您只需要在循环中的一个地方处理写入数据,但另一方面,它会将数据写入延迟到下一次循环。)
- 急切地尝试立即发送其中的一些内容。您可能会成功发送一个、部分或全部。和前面的情况一样,保留下一次没有写入的部分数据,并计划在下次有数据剩余时通过循环设置
关于c - 什么时候使用poll C函数的POLLOUT事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12170037/