求解qt udp接收丢数据问题
发送端会没有sleep的发送多个1024字节的数据包过来,接收端使用qt QUDPSocket 编程,接收到的数据长度和发送端发送的数据差别很大,丢包率非常大。
而同样的环境下使用vs编写的udp接收程序就没这个问题,发送端和接收端数据长度完全吻合,下面我贴上我qt编写的udp接收程序
receiver = new QUdpSocket(this);
connect(receiver, SIGNAL(readyRead()), this, SLOT(dataReceived()),Qt::AutoConnection);
port = 12345;
if (!receiver->bind(port, QUdpSocket::ShareAddress)) {
QMessageBox::information(this,tr("error"),tr("udp socket create error!"));
return;
}static unsigned long recvCount = 0;
void Receiver::dataReceived()
{
// 拥有等待的数据报
while(receiver->hasPendingDatagrams())
{
QByteArray datagram;
datagram.resize(receiver->pendingDatagramSize());
receiver->readDatagram(datagram.data(), datagram.size());
recvCount += datagram.size();
qDebug()<<"====== "<<recvCount;
//reveiveData->append(datagram);
}
}然后我又尝试用qt使用windows api编写udp接收程序,发现同样的代码,vs编写下的win32控制台程序就正常,qt 编写的丢包率就非常严重
贴上我用vs 和 qt 调用windows api 编写的udp接收程序
VS2008:
int _tmain(int argc, _TCHAR* argv[])
{
int mSock = createSocket(UDP_SOCK);
struct sockaddr_in fromAddr;
int fromLen = sizeof(fromAddr);
char recvBuf[2048]={0};
unsigned long mCount = 0;
bindSocket(mSock,12345);
while(1){
int recvLen = recvfrom(mSock,recvBuf,sizeof(recvBuf), 0,(struct sockaddr *)&fromAddr, &fromLen);
if(recvLen <= 0){
//QThread::usleep(1000);
continue;
}
mCount += recvLen;
printf(" ==== %d\n",mCount);
}
return 0;
}
QT :
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
createThread();
}
Widget::~Widget()
{
QThread::msleep(1000);
delete ui;
}
void udpRecvThread()
{
int mSock = createSocket(UDP_SOCK);
struct sockaddr_in fromAddr;
int fromLen = sizeof(fromAddr);
char recvBuf[2048]={0};
unsigned long mCount = 0;
bindSocket(mSock,12345);
while(1){
int recvLen = recvfrom(mSock,recvBuf,sizeof(recvBuf), 0,(struct sockaddr *)&fromAddr, &fromLen);
if(recvLen <= 0){
continue;
}
mCount += recvLen;
qDebug()<<"***"<<mCount;
}
}
void Widget::createThread()
{
DWORD stateThreadID = 0;
HANDLE udpThreadHandle= CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)udpRecvThread,NULL,0,&stateThreadID);
if(udpThreadHandle==NULL){
printf("create state send speed thread ERR\n");
}
}现在非常困惑,因为必须使用qt 来编写udp接收程序,如果丢包问题不解决后面都没法做,所以想问大家有没有解决方法 谢谢!
相关推荐
基于UDP协议的多线程高速接收QT工程
然而,UDP不保证数据的可靠传输,可能会有丢包、乱序等问题。本项目通过多线程技术来解决这个问题,确保在20Mbps(兆比特每秒)的高速接收环境下能够不丢包地接收数据。
从零构建复合型AMR控制系统:SLAM、Qt界面与多机协同实战
移动机器人(AMR)是工业自动化与智能物流的核心载体,其核心在于通过SLAM(即时定位与地图构建)技术实现环境感知与自主导航。SLAM算法融合激光雷达与里程计数据,构建环境地图并实时定位,为路径规划与决策提供基础。这项技术的价值在于赋予机器人高度的环境适应性与作业柔性,使其能摆脱传统AGV的固定轨道限制。在实际应用中,结合模块化的软件架构与高效的网络通信,可实现多机协同作业与复杂任务调度。本文以仓储物流为典型场景,深入探讨了基于C++与Qt框架,从激光SLAM集成、底盘控制API封装,到Qt/QML界面开发
Qt+OpenGL工业级机器人仿真架构设计与实现
机器人仿真系统本质上是实时图形渲染与运动学计算的协同工程,其核心在于图形管线(OpenGL)与业务逻辑(Qt事件/线程模型)的物理隔离。现代仿真要求60FPS稳定帧率、低CPU占用、跨硬件协议兼容,这依赖于Qt作为中枢事件总线的能力——统一调度UDP/USB/CAN设备、安全跨线程通信、自动内存管理;同时需严格采用OpenGL Core Profile 4.5+、实例化渲染、共享上下文等现代图形技术。本文聚焦Qt与OpenGL协同架构设计,覆盖URDF解析、instanced rendering、WSL G
Qt+OpenGL机器人仿真实战:从URDF加载到实时关节控制
机器人三维仿真是工业数字孪生与算法验证的核心环节,其本质是基于齐次变换的实时空间建模与GPU加速渲染。理解OpenGL的矩阵流水线、Qt的跨平台事件调度机制及URDF模型的空间语义解析,是构建高保真、低延迟、可调试仿真系统的技术基石。本文聚焦Qt 5.15 + OpenGL Core Profile技术栈,详解URDF解析、坐标系对齐、关节变换矩阵计算、多线程安全渲染等工程关键点,覆盖PUMA560等典型机械臂的动态仿真搭建,并支持UDP直连真实控制器、Bullet物理集成等进阶能力,为嵌入式工程师与ROS
Qt5--UDP图片的发送与接收
Qt5是一个强大的跨平台应用程序开发框架,它提供了丰富的网络编程接口,可以方便地实现UDP通信。首先,我们需要了解Qt5中的网络模块,特别是`QTcpSocket`和`QUdpSocket`类。


