QtCreator和boost :: asio :: ip :: udp :: socket vs QUdpSocket

时间:2015-01-19 08:29:03

标签: c++ qt sockets boost udp

我正在用QtCreator编写一个程序,用于接收UDP数据 从发送大约20 MBps的源(暂时在本地机器上)。 在我的项目的开始,我使用了QUdpSocket对象但我意识到了 这是缓慢的,无法跟上接收这么多的数据。 一些在线论坛我确认这是真的 - QUdpSocket很慢 我被建议使用boost :: asio :: ip :: udp :: socket。我把它连接到QtCreator 并在教程上编写代码 http://www.boost.org/doc/libs/1_35_0/doc/html/boost_asio/tutorial/tutdaytime6.html基础。 Hovever我有一些问题。 Qt项目的结构不适合本教程中的代码。

我的代码:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    oscilloscope::Oscilloscope w;
    w.show();

    return a.exec();
}

oscilloscope.h

class Oscilloscope
{
    ...
    boost::asio::io_service io_serv;
    UdpReceiver *port1;

    ...
}

oscilloscope.cpp

oscilloscope::oscilloscope()
{
...........
    try
    {
        port1 = new UdpReceiver(io_serv);
        io_serv.run();          // <- it is very important
    }
    catch(std::exception& e)
    {
        std::cerr << e.what() << "\n";
    }   
...........
}

udpreceiver.h

class UdpReceiver
{
    udp::socket sockPort;
    udp::endpoint remote_endpoint;
    boost::array<char, 1> rec_buffer;

public:
    UdpReceiver(boost::asio::io_service & io_serv);

private:
    void StartReceive();
    void handle_receive(const boost::system::error_code& error,
                                     std::size_t bytes_transferred);
};

udpreceiver.cpp

UdpReceiver::UdpReceiver(boost::asio::io_service & io_serv):
    sockPort(io_serv, udp::endpoint(udp::v4(), 7755))
{
    StartReceive();
}

void UdpReceiver::StartReceive()
{
   sockPort.async_receive_from(
            boost::asio::buffer(rec_buffer), remote_endpoint,
            boost::bind(&UdpReceiver::handle_receive, this,
              boost::asio::placeholders::error,
              boost::asio::placeholders::bytes_transferred));

}

void UdpReceiver::handle_receive(const boost::system::error_code& error,
                                 std::size_t bytes_transferred)
{
    if (!error || error == boost::asio::error::message_size)
    {
        std::string err = error.message();
        StartReceive();
    }
    else
    {
        std::string ss = error.message();
        std::cerr << ss << " " << error.value() << "\n";

        StartReceive();
    }
}

应用程序在接收数据时正确进入函数handle_receive 但第一个条件总是假的。 执行第二个条件(否则)并打印 错误234 - 有更多数据可供使用。

这是什么意思?我在哪里犯了错误? 有人能帮助我吗? QUdpSocket这么慢是真的吗?

祝你好运 米沃什

0 个答案:

没有答案
相关问题