0

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

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

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

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

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

是否有可能最好使用 Boost::ASIO 和async_receive_from? 如果没有:是否有其他图书馆可以做这样的事情?

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

4

1 回答 1

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

于 2013-06-17T22:41:46.953 回答