假设客户端发送了 100 字节的数据,但不知何故服务器只收到了 90 字节。我该如何处理这种情况?如果服务器在 while 循环中调用“读取”函数来检查接收到的总数据,那么服务器将永远等待最后 10 个字节的数据包。
此外,客户端可能会在数据传输过程中断开连接。在这种情况下,服务器也将永远等待,直到它收到所有不会到达的数据..
我正在使用 tcp 但在现实世界的网络环境中,这种情况可能会发生。提前致谢...
最佳答案
在收到所需的字节数之前,不要在循环中调用 read()
函数。相反,您将套接字设置为非阻塞并在循环中调用 read()
函数,直到它返回 0
(表示流结束)或错误。
在正常情况下,循环将终止于 read()
返回 -1,errno
设置为 EAGAIN
。这表示连接尚未关闭,但当前没有更多数据可用。此时,如果您还没有从客户端获得足够的数据,您只需保存您拥有的数据以备后用,然后返回到主 epoll()
循环。
如果剩余数据到达时,套接字将返回为可由 epoll()
读取,您将 read()
剩余数据,检索保存的数据并处理所有数据。
这意味着您需要在每个套接字数据结构中存储已读取但尚未处理的数据。
关于linux - 使用 epoll() 处理短读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6462520/