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

时间:2013-06-17 14:36:07

标签: c++ networking boost udp boost-asio

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

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

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

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

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

是否可以使用Boost :: ASIO和async_receive_from来实现这样的效果?如果没有:是否有其他库可以做这样的事情?

如果提供了另一种解决方案:我正在使用Linux和Windows,如果您的解决方案是可移植的,那将会很酷。

1 个答案:

答案 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中,您将需要一种方法来创建一个包含已处理数据的线程,该线程将独立于主线程运行。如果对此如何处理有任何疑惑,请告诉我。