gpt4 book ai didi

c++ - 从网络队列中读取多个数据报

转载 作者:行者123 更新时间:2023-11-28 03:15:05 24 4
gpt4 key购买 nike

我通过使用带 UDP 的 Boost ASIO 将数据报从一个点传输到另一个点。

  • 我的发件人每 500 毫秒发送一个数据报
  • 我的接收器监听传入的数据,然后使用它。接收方使用 async_receive_from接收数据

在某些情况下,接收器可能需要超过 500 毫秒的时间来处理数据。发送方不会停止发送数据。

当前行为:
发送的数据报在操作系统网络队列中排队。当我执行 async_receive_from 时,我得到了下一个要使用的 UDP 数据报。

想要的行为:
发送的数据报在操作系统网络队列中排队。当我执行接收时,我得到了所有数据报。队列是空的。我不知道队列中有多少数据报,也不知道它们的大小。

是否有可能通过 Boost::ASIO 和 async_receive_from 实现这样的效果?如果没有:是否有其他图书馆可以做这样的事情?

如果提供另一种解决方案:我在 Linux 和 Windows 上工作,如果您的解决方案是可移植的,那就太好了。

最佳答案

最好的方法是尽可能使用多线程。以下是我制作的一段类似的代码,本质上与您想要的类似。

void Session::handle_read(const boost::system::error_code& error, size_t bytes_transferred)
{
static int count = 0;
std::cout << "reading..." << std::endl;
//std::string sClientIp = socket().remote_endpoint().address().to_string();
if (!error)
{
// This is one place where you can put your thread call.
try
{
// Will have async_read_some reading on the socket and call handle_read when something is transfered
socket_.async_read_some(boost::asio::buffer(dataRx, max_length),
boost::bind(&Session::handle_read, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
catch(std::exception& e)
{
std::cout << "Read some failed: " << e << std::endl;
}
}
else if(error == boost::asio::error::eof)
{
std::cout << "There was an error in handle_read" << std::endl;
delete this;
}
else
{
std::cout << "some error" << std::endl;
}
}

在 handle_read 内部,您需要一种方法来创建一个线程来处理数据,该线程将独立于主线程运行。如果对此处理方式有任何混淆,请告诉我。

关于c++ - 从网络队列中读取多个数据报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17150150/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com