【问题标题】:epoll exception handleepoll异常句柄
【发布时间】:2011-06-21 07:01:04
【问题描述】:

我正在使用 epoll 进行网络编程。我想知道服务器没有收到客户端发送的所有数据的情况。例如,如果客户端发送了 100 个字节,而服务器以某种方式只收到了 94 个字节。我该如何处理这种情况?

提前谢谢..

【问题讨论】:

  • 这与 C++ 或 epoll 无关。
  • 通常这必须在应用程序级别处理,如果您收到的数据少于预期,您需要以某种方式重新请求该数据。如果您的连接是 TCP,我很惊讶,如果是 UDP,那么一切皆有可能。可能是随后的等待操作将返回未完成的数据 - 您尝试过吗?

标签: c++ epoll


【解决方案1】:

epoll 发出信号准备就绪,它不保证数据量。 EPOLLIN 仅向您保证,对描述符的下一次读取操作不会阻塞并且至少会读取 1 个字节。
由于通常出于各种(部分特定于操作系统的)原因将描述符设置为非阻塞,通常的习惯用法是读取直到返回 EAGAIN。如果这比预期的数据少(例如,如果您有一条消息的标题是“我的大小是 100 字节”),那么您将等待下一个 EPOLLIN(或 EPOLLHUP)并重复(或中止)。

对于 TCP,接收的数据少于预期是绝对正常的情况。重复。

对于 UDP,除非您提供的缓冲区太小(这将丢弃剩余的缓冲区!),否则不会发生这种情况。永远不能。 UDP 一次传送整个数据报或不传送。没有部分交货。如果发生 IP 分片,UDP 会将所有分片重新组合成一个数据报,并传递一个完整的数据报。如果片段丢失,UDP 将不提供任何内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 2014-12-06
    • 1970-01-01
    相关资源
    最近更新 更多