Qt 使用UDPSocket遇到的丢包问题

最近烦人的事情很多,所以博客一直被落下了。这样不好,希望可以敦促自己不要懒惰。

前些日子接下了一个撂摊子的项目,这个项目中大量的使用udp socket进行多软件多硬件的来回通讯过程,但说实话通信量不是特别大。但是经常遇到各种各样奇怪的丢包现象。在解决这些问题过程中,也算加强了一些基础知识的学习,在此也顺便记录下解决步骤,以便下次项目中使用。

该项目中软件部分有A、B两个软件。其中A和B都有各自的发送和接受UDP功能。

代码实现很简单:

发送端:

void UdpServer::send(const QString &message)
{
    qDebug() << "message not null" << message;
    QByteArray byte;
    byte.append(message.toAscii());
    _socket->writeDatagram(byte,mcast_addr,tempport);
}

UdpServer::UdpServer(QObject *parent):QObject(parent)
{
    _socket = new QUdpSocket();
}


 

接收端:

void UdpClient::recv()
{
    while(_socket->hasPendingDatagrams())
    {
        QByteArray data;
        data.resize(_socket->pendingDatagramSize());
        _socket->readDatagram(data.data(),(qint64)data.size());
//        QString byteStr = QString(data.toHex());
//        qDebug() << "此次接受的报文内容是:" << byteStr;
        if(byteStr.left(4)=="5555"){
		.....
	}else if(byteStr.left(4)=="6666"){
		.....
	}
	....
    }
}

以上是原程序。

刚开始测试的时候,另一程序以每500ms速度发送长度为512长度的报文,发现丢包现象比较严重。开始怀疑是否是因为收包程序while中有大量的逻辑判断逻辑而造成报文并没有及时的接受到。于是新建一个数据缓存池CDataPool类,并继承于Qthread类。接受到报文后,不进行任何处理,直接放至CDataPool类的队列中,然后另起线程进行报文解析操作,代码如下:

CDataPool.h

/***********************************************************************
 * Module:  CDataPool.h
 * Author:  振星
 * Modified: 2014年11月4日星期二 09:57:45
 * Purpose: Declaration of the class CDataPool
 * Comment: 数据管理类
 ***********************************************************************/

#ifndef CDATAPOOL_H
#define CDATAPOOL_H
#include <QtCore/qglobal.h>
#includ
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值