1

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

提前致谢..

4

1 回答 1

3

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

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

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

于 2011-06-21T17:34:40.597 回答