我正在用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这么慢是真的吗?
祝你好运 米沃什