应用程序级协议设计中recvfrom()的混淆
假设使用Linux和UDP recvfrom的报告说: receive calls(接收呼叫)通常返回所有可用数据,最多返回请求的金额,而不是等待收到请求的全部金额 如果是这种情况,则很可能从套接字返回部分应用程序级协议数据,即使设置了所需的应用程序级协议设计中recvfrom()的混淆,c,protocols,C,Protocols,假设使用Linux和UDP recvfrom的报告说: receive calls(接收呼叫)通常返回所有可用数据,最多返回请求的金额,而不是等待收到请求的全部金额 如果是这种情况,则很可能从套接字返回部分应用程序级协议数据,即使设置了所需的MAX_SIZE 是否应随后调用recvfrom 从另一个意义上讲,它也可能有比我想要的更多的数据,例如套接字缓冲区中的两个UDP数据包。如果在本例中调用了recvfrom(),它会同时返回这两个值吗(假设在MAX\u SIZE中) 我想在每个UDP消息的开
MAX_SIZE
是否应随后调用recvfrom
从另一个意义上讲,它也可能有比我想要的更多的数据,例如套接字缓冲区中的两个UDP数据包。如果在本例中调用了recvfrom()
,它会同时返回这两个值吗(假设在MAX\u SIZE
中)
我想在每个UDP消息的开头应该有一些应用程序协议级别的大小信息,这样它就不会出错。我想您想要的手册页是。它声明将丢弃额外的数据。如果有两个数据包,recvfrom调用将只从第一个数据包中检索数据。嗯..在搜索web后,我得到了一个更好的答案: 在读取时,不要害怕使用大缓冲区和指定大数据报大小
recv()
将仅读取一个数据报,即使接收缓冲区中有许多数据报,并且它们都适合您的缓冲区。。。请记住,UDP是面向数据报的,所有操作都在这些数据包上,而不是字节上
如果使用TCP套接字,将面临不同的场景TCP没有任何边界“概念”,因此您只需读取所需的字节数,recv()
将返回一个等于MIN的字节数(缓冲区中的字节数,您的调用请求的字节数)
REF:那么接下来的recvfrom()调用呢?它会得到第一个留下的缓冲区中已经存在的第二个吗?@Figo:是的,它一次返回一个。