UDP – 以块的forms从队列中读取数据

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

有没有办法在块中读取这些消息而不将它们从队列中删除,直到它们被完全读取?

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

UDP协议没有理由要求为每条消息发送字节大小。 消息大小本身隐含地指示消息内部数据的大小。

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

您可以创建一个Thread来无限地从UDP Buffer中读取数据并将数据保存到循环缓冲区。 比客户端以您的速度消耗数据。 如果缓冲区溢出,则无法执行任何操作。因为服务器的发送速度比客户端快。