假设使用Linux和UDP。
recvfrom的manpage说:
接听电话通常返回任何可用数据,直至请求的金额,而不是等待收到所请求的全部金额。
如果是这种情况,那么即使设置了MAX_SIZE
,也很有可能从套接字返回部分应用程序级协议数据。
是否应该对recvfrom
进行后续调用?
在另一种意义上,它还可能包含多个我想要的数据,例如套接字缓冲区中的两个UDP数据包。如果在这种情况下调用recvfrom()
,它是否会返回它们(假设在MAX_SIZE
内)?
我想在每个UDP消息的开头应该有一些应用程序协议级别大小信息,这样它就不会搞砸了。
答案 0 :(得分:1)
我认为您想要的手册页是this one。它声明将丢弃额外的数据。如果有两个数据包,则recvfrom调用将仅从第一个数据包中检索数据。
答案 1 :(得分:1)
嗯......我在搜索网页后得到了一个更好的答案:
在阅读时不要害怕使用大缓冲区并指定大数据报大小... recv()
只读取一个数据报 即使有很多它们在接收缓冲区中并且它们都适合您的缓冲区...记住,UDP是面向数据报,所有操作都在这些数据包上,而不是在字节上......
如果您使用TCP套接字,则会遇到不同的情况.... TCP没有任何边界“概念”,因此您只需读取所需的字节数{{1将返回一个等于recv()
参考:http://www.developerweb.net/forum/archive/index.php/t-3396.html