我正在使用boost :: asio构建的UDP服务器,我从教程中开始定制我的需求.当我调用socket.receive_from(boost::asio::buffer(buf), remote, 0, error);
它时,用数据包中的数据填充我的缓冲区,但是,如果我的理解是正确的,它会丢弃任何不适合缓冲区的数据.对receive_from的后续调用将接收下一个可用的数据报,因此在我看来,即使没有通知,也会有一些数据丢失.我理解这是错误的方式吗?
我试着一遍又一遍地阅读boost :: asio文档,但我没有设法找到关于我应该以正确的方式做到这一点的线索.我想做的是读取一定数量的数据,以便我可以处理它; 如果读取整个数据报是唯一的方法,我可以管理它,但是我怎么能确保不丢失我收到的数据?我应该使用什么缓冲区大小来确定?有什么方法可以告诉我我的缓冲区太小而且我丢失了信息吗?
我不得不假设我可能会收到大量的数据报.
这不是特定的提升; 这就是数据报套接字的工作原理.您必须指定缓冲区大小,如果数据包不适合缓冲区,则它将被截断,并且无法恢复丢失的信息.
例如,SNMP协议指定:
该协议的实现不需要接受长度超过484个八位字节的消息.但是,建议实现在可行的情况下支持更大的数据报.
简而言之:在设计通信协议时,您必须考虑到数据报可能会丢失,或者它们可能被截断超出某些指定的大小.