linux - 使用 epoll() 处理短读

标签 linux networking tcp epoll

假设客户端发送了 100 字节的数据,但不知何故服务器只收到了 90 字节。我该如何处理这种情况?如果服务器在 while 循环中调用“读取”函数来检查接收到的总数据,那么服务器将永远等待最后 10 个字节的数据包。

此外,客户端可能会在数据传输过程中断开连接。在这种情况下,服务器也将永远等待,直到它收到所有不会到达的数据..

我正在使用 tcp 但在现实世界的网络环境中,这种情况可能会发生。提前致谢...

最佳答案

在收到所需的字节数之前,不要在循环中调用 read() 函数。相反,您将套接字设置为非阻塞并在循环中调用 read() 函数,直到它返回 0(表示流结束)或错误。

在正常情况下,循环将终止于 read() 返回 -1,errno 设置为 EAGAIN。这表示连接尚未关闭,但当前没有更多数据可用。此时,如果您还没有从客户端获得足够的数据,您只需保存您拥有的数据以备后用,然后返回到主 epoll()循环。

如果剩余数据到达时,套接字将返回为可由 epoll() 读取,您将 read() 剩余数据,检索保存的数据并处理所有数据。

这意味着您需要在每个套接字数据结构中存储已读取但尚未处理的数据。

关于linux - 使用 epoll() 处理短读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6462520/

相关文章:

javascript - 来自 HTML/Javascript 网页的 Modbus TCP 通信

Python "push server"TCP 客户端

linux - 在 Ubuntu 14.04 中写入嵌入式 Controller 寄存器

linux - bash 脚本中的 [...] 代表什么?

linux - 全新的CentOS 7安装“连接超时”

c - 用 C 代码从 IPV4 迁移到 IPV6

sockets - 服务器和客户端之间成功的 TCP 连接

c++ - 多次加载 DLL?

java - J2ME中如何实现线程超时?

c++ - NIC的TX/RX buffer中的数据是如何传输到dpdk ring buffer而不是kernel ring buffer的?