我正在使用带有UDP的Boost ASIO将数据报从一个点传输到另一个点。
在某些情况下,接收器可能需要超过500毫秒来处理数据。发件人不会停止发送数据。
当前行为:
发送的数据报在操作系统网络队列中排队。当我执行async_receive_from
时,我会使用下一个UDP数据报。
通缉行为:
发送的数据报在操作系统网络队列中排队。当我执行接收时,我获得所有数据报。那时队列是空的。我不知道队列中有多少数据报,我也不知道它们的大小。
是否可以使用Boost :: ASIO和async_receive_from
来实现这样的效果?如果没有:是否有其他库可以做这样的事情?
如果提供了另一种解决方案:我正在使用Linux和Windows,如果您的解决方案是可移植的,那将会很酷。
答案 0 :(得分:2)
最好的方法是使用多个线程,如果可能的话。以下是我制作的类似代码,其性质与您想要的类似。
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中,您将需要一种方法来创建一个包含已处理数据的线程,该线程将独立于主线程运行。如果对此如何处理有任何疑惑,请告诉我。