c - 什么时候使用poll C函数的POLLOUT事件?

标签 c tcp posix polling

我用 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/

相关文章:

c++ - c 向我的编辑器添加自动建议

java - 是打开不同的端口更好,还是打开一个带有标识符的端口更好(或者其他)?

sockets - 两个进程使用同一个端口?

c - EAGAIN 对常规文件的阻塞读取系统调用

调用memset导致segmentation fault

c++ - _itoa 和 itoa 有什么区别?

C 代码未显示正确的内容

c# - 自动刷新 tcp 流不起作用

c - Unix getaddrinfo C函数启动服务器的用法

c - 深度优先遍历目录