最近烦人的事情很多,所以博客一直被落下了。这样不好,希望可以敦促自己不要懒惰。
前些日子接下了一个撂摊子的项目,这个项目中大量的使用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