gpt4 book ai didi

c - UDP - 以 block 的形式从队列中读取数据

转载 作者:行者123 更新时间:2023-12-03 11:50:00 34 4
gpt4 key购买 nike

我正在使用 UDP(C 语言)实现一个小型应用程序。服务器以给定数量(例如 100 字节/调用)的 block 向客户端发送来自给定文件的数据。客户端下载文件并将其保存在某处。问题是客户端可以接收一个参数,说明要读取/调用多少字节。
我的问题是当服务器发送 100 字节/调用时,客户端设置为只读取 15 字节/调用。其他 85 个字节丢失,因为消息已从 UDP 队列中删除。

有没有一种方法可以分块读取这些消息,而无需将它们从队列中移除,直到它们被完全读取?

最佳答案

UDP 不允许像 TCP 那样进行分块读取。读取 UDP 消息是一个全有或全无的操作,您要么完整地读取整个消息,要么根本不读取。没有中间。因此,基于 UDP 的协议(protocol)要么使用固定大小的消息,要么要求双方动态协商消息大小(例如 TrivialFTP 所做的那样)。

UDP 协议(protocol)没有理由要求为每条消息发送一个字节大小。消息大小本身隐式规定了消息中数据的大小。

如果您绝对必须在实际读取消息之前确定消息大小,您可以尝试使用 MSG_PEEK 标志调用 recvfrom(),并给它一个大缓冲区以将数据复制到(至少 64K,UDP 消息永远不会超过,除非您使用 IPv6 Jumbograms,但这是一个单独的问题)。输出将告诉您仍在队列中的消息的实际大小。但是,如果您走这条路,那么您也可以删除 MSG_PEEK 标志并始终使用 64K 缓冲区进行读取,这样就不会因缓冲区大小不足而丢失数据。

关于c - UDP - 以 block 的形式从队列中读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15446887/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com