求解qt udp接收丢数据问题

lishi-1991 CSDN会员 lishi-1991 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
想用qt编写一个udp接收文件的程序,结果发现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

weixin_34221332

Qt+OpenGL机器人仿真实战:从URDF加载到实时关节控制

机器人三维仿真是工业数字孪生与算法验证的核心环节,其本质是基于齐次变换的实时空间建模与GPU加速渲染。理解OpenGL的矩阵流水线、Qt的跨平台事件调度机制及URDF模型的空间语义解析,是构建高保真、低延迟、可调试仿真系统的技术基石。本文聚焦Qt 5.15 + OpenGL Core Profile技术栈,详解URDF解析、坐标系对齐、关节变换矩阵计算、多线程安全渲染等工程关键点,覆盖PUMA560等典型机械臂的动态仿真搭建,并支持UDP直连真实控制器、Bullet物理集成等进阶能力,为嵌入式工程师与ROS

weixin_33805743

Qt5--UDP图片的发送与接收

Qt5是一个强大的跨平台应用程序开发框架,它提供了丰富的网络编程接口,可以方便地实现UDP通信。首先,我们需要了解Qt5中的网络模块,特别是`QTcpSocket`和`QUdpSocket`类。

liefyuan
评论 8
收藏 已收藏
分享
返回顶部
lishi-1991 CSDN会员
Qt 21,503 成员 26,693 内容