Boost.ASIO UDP套接字:接收所有数据包
Boost.ASIO UDP socket: sink all the packets
我正在使用 boost::asio::ip::udp::socket 通过套接字的 async_receive_from 方法接收 UDP 数据包。
代码运行良好,唯一的问题是在我处理数据包时,更多的数据包会创建队列(缓冲区)进行处理。我的程序虽然必须接收自处理开始以来收到的所有数据包,以便它只侦听最近的数据包。
示例:
- 数据包 1 已发送
- 正在处理数据包 1
- 数据包 2、3、4 已发送
- 数据包1结束计算
- 刷新缓冲区
- 数据包 5 已发送
- 正在处理数据包 5
- 等等
有什么办法可以把中间的包丢掉吗?
谢谢!
使用仅包含单个数据报的缓冲区。
继续读入缓冲区,直到没有更多数据报可读。
如果至少读取一个数据包,则处理缓冲区中的数据报。
转到步骤 2。
请注意,UDP 是数据报协议,而不是数据包协议。单个 UDP 数据报可以拆分为多个数据包。
我认为可以很简单地完成:
async_receive_from
直到收到一个包裹。
- 检查
available
方法以确定套接字中是否有更多数据。
- 如果我们有更多数据,丢弃缓冲区并转到1;否则处理数据包
我正在使用 boost::asio::ip::udp::socket 通过套接字的 async_receive_from 方法接收 UDP 数据包。
代码运行良好,唯一的问题是在我处理数据包时,更多的数据包会创建队列(缓冲区)进行处理。我的程序虽然必须接收自处理开始以来收到的所有数据包,以便它只侦听最近的数据包。
示例:
- 数据包 1 已发送
- 正在处理数据包 1
- 数据包 2、3、4 已发送
- 数据包1结束计算
- 刷新缓冲区
- 数据包 5 已发送
- 正在处理数据包 5
- 等等
有什么办法可以把中间的包丢掉吗? 谢谢!
使用仅包含单个数据报的缓冲区。
继续读入缓冲区,直到没有更多数据报可读。
如果至少读取一个数据包,则处理缓冲区中的数据报。
转到步骤 2。
请注意,UDP 是数据报协议,而不是数据包协议。单个 UDP 数据报可以拆分为多个数据包。
我认为可以很简单地完成:
async_receive_from
直到收到一个包裹。- 检查
available
方法以确定套接字中是否有更多数据。 - 如果我们有更多数据,丢弃缓冲区并转到1;否则处理数据包