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

时间:2013-03-16 07:46:00

标签: c sockets udp datagram

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

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