2013-03-16 20 views
1

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

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

+0

更改您的客户端服务器协议,以避免两端互相混淆 – Vorsprung 2013-03-16 07:53:45

+0

这将是伟大的,但我没有创建协议。我必须为我的计算机网络课程和协议提供小应用程序。 – 2013-03-16 08:01:39

+0

好的让我换一种方式。 “当服务器发送100字节/呼叫时,客户端设置为只读15字节/呼叫”您必须控制一端或另一端。只是不要设置客户端和服务器读取错误的字节数! – Vorsprung 2013-03-16 08:20:42

回答

2

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

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

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

+0

感谢您的回答。这是我在研究问题时得到的结论。 +1为好解释。 – 2013-03-16 08:36:29

0

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