2010-01-28 41 views
2

假设Linux和使用UDP。上recvfrom的混乱()在应用程序级协议设计

recvfrom的的manpage说:

的接听电话通常返回可用任何数据,直到请求的数量,而不是等待接收请求的全额。

如果是这种情况,那么它是非常可能从插座返回部分应用程序级协议数据,即使期望MAX_SIZE被设置。

recvfrom的后续调用进行?

在另一种意义上,它也可能有比我想要的数据,在插座的缓冲比如两个UDP包多。如果recvfrom()被称为在这种情况下,它会返回他们两个(内MAX_SIZE假设)?

我想应该有一些应用协议级别的大小信息在每个UDP消息的开始,以便它不会搞砸。

回答

1

Well..I得到一个更好的答案在网上搜索后:

不要害怕使用一个大的缓冲区,并指定读取时,大数据报大小的... recv()只读ONE报即使有很多人在接收缓冲区,他们都适合你的缓冲......记住,UDP是面向数据报,所有的操作都在这些数据包,而不是字节...

一如果您使用TCP套接字,将会面临不同的情况.... TCP没有任何边界“概念”,所以你就像你想读的字节数和recv()将返回的字节数等于MIN(bytes_in_buffer, bytes_solicited_by_your_call)

REF:http://www.developerweb.net/forum/archive/index.php/t-3396.html

1

我想你想的手册页this one。它声明额外的数据将被丢弃。如果有两个数据包,recvfrom调用将只从第一个数据中检索数据。

+0

那么关于后续recvfrom的( )电话?它会得到第一个已存在于第一个缓冲区中的第二个缓冲区吗? – Figo 2010-01-28 03:49:51

+0

@Figo:是的,它一次只返回一个。 – 2010-01-28 04:08:14