混淆应用程序级协议设计中的recvfrom()

时间:2010-01-28 02:42:29

标签: c protocols

假设使用Linux和UDP。

recvfrom的manpage说:

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

如果是这种情况,那么即使设置了MAX_SIZE,也很有可能从套接字返回部分应用程序级协议数据。

是否应该对recvfrom进行后续调用?

在另一种意义上,它还可能包含多个我想要的数据,例如套接字缓冲区中的两个UDP数据包。如果在这种情况下调用recvfrom(),它是否会返回它们(假设在MAX_SIZE内)?

我想在每个UDP消息的开头应该有一些应用程序协议级别大小信息,这样它就不会搞砸了。

2 个答案:

答案 0 :(得分:1)

我认为您想要的手册页是this one。它声明将丢弃额外的数据。如果有两个数据包,则recvfrom调用将仅从第一个数据包中检索数据。

答案 1 :(得分:1)

嗯......我在搜索网页后得到了一个更好的答案:

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

如果您使用TCP套接字,则会遇到不同的情况.... TCP没有任何边界“概念”,因此您只需读取所需的字节数{{1将返回一个等于recv()

的字节数

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