3

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

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

4

2 回答 2

4

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

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

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

于 2013-03-16T08:26:14.577 回答
0

您可以创建一个线程以无限地从 UDP 缓冲区读取数据并将数据保存到循环缓冲区。比客户端以您的速度消耗数据。如果 Buffer 溢出,你什么都做不了。因为服务器的发送速度比客户端的快。

于 2013-03-16T08:27:17.867 回答