QT UDP 上位机接收AD采集的数据包

syb_love_jiexin 2018-12-07 09:15:01
参考网上资料,在“利用QT接收数据包并存储”的过程中遇到了两个问题,麻烦论坛大神们帮忙分析解答,十分感谢。
首先说明,实际测试的数据率是每秒3M(可下调),每包1028个字节,其中前四个字节表示包序,后1024个字节表示数据,上位机先利用wireshark抓包是不存在问题的。
最开始使用QThread类开辟一个用来接收UDP包的新线程,现在使用winsocket接收数据包。
问题:
1.使用QThread类开辟新线程的方法,验证接收到的数据包存在丢包,丢包率大约0.1%,没办法完全避免,请问这种方法是否可以做到,在我的数据率前提下,不丢包
2.现在使用winsocket接收数据包,我先粘贴一下代码

mainwindow.h文件:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <winsock2.h>
#include <QDebug>
#include <QFile>
#include <QObject>
#include <QDateTime>
#include <QMutexLocker>
#include <QtCore>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

DWORD ver;
WSADATA WSAdata;
SOCKET sockRecver;
struct sockaddr_in addr_recv;
struct sockaddr_in src_addr;
int len;
QFile f;


private:
Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp文件:
#include "mainwindow.h"
#include "ui_mainwindow.h"

#define PORT_recv 1026
#define IP_recv "192.168.0.3"
#define recvLen 1028

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);

ver=MAKEWORD(1,1);
if(WSAStartup(ver,&WSAdata) != 0)
{qDebug()<<"winsock initialization FAILED.";}
sockRecver=socket(AF_INET,SOCK_DGRAM,0);
if(sockRecver == INVALID_SOCKET)
{qDebug()<<"winsocket error !";}
memset(&addr_recv,0,sizeof(addr_recv));
addr_recv.sin_family=AF_INET;
addr_recv.sin_port=htons(PORT_recv);
addr_recv.sin_addr.S_un.S_addr=inet_addr(IP_recv);
if(bind(sockRecver,(struct sockaddr*)&addr_recv,sizeof(struct sockaddr)) == SOCKET_ERROR)
{qDebug()<<"bind error !";closesocket(sockRecver);}
len=sizeof(struct sockaddr);

//************************************************************************************

QString a = QDateTime::currentDateTime().toString("yyyyMMddhhmmss");
QString time = a;
QString dirname = "D:\\" + time +"";
QDir dir;
if(dir.mkdir(dirname))
{qDebug()<<"文件建立成功" ;}
else
{qDebug()<<"文件建立失败" ;}

QString min = QDateTime::currentDateTime().toString("yyyyMMddhhmmss");
//打开文本 以时间命名文件名字
QString fileName = "D:\\"+ time +"\\" + min + ".dat";
QFile f(fileName);
if(!f.open( QIODevice::WriteOnly ))
return;

//************************************************************************************

char buff[recvLen];
int i=0;
while(TRUE)
{
if (recvfrom(sockRecver,buff,1028,0,(struct sockaddr*)&src_addr,&len) == SOCKET_ERROR)
{
closesocket (sockRecver);
qDebug()<<"错误";
}
else
{
qDebug()<<buff;
if(i % 50000 == 0)
{
f.close();
//获得系统时间并输出
QString min = QDateTime::currentDateTime().toString("yyyyMMddhhmmss");
QString fileName = "D:\\"+ time +"\\" + min + ".dat";
f.setFileName(fileName);
if(!f.open( QIODevice::WriteOnly ))
return;
}
QDataStream put(&f);
put << buff ;
i = i + 1;
}
}
}

MainWindow::~MainWindow()
{
delete ui;
}

首先我的 .dat 文件中存不下来数据,然后我 qDebug()<<buff; 查看接收到的数据是这样的:
0L
1L
2L
3L
4L
9L
:L
@L
nL
?L
?L
?L
L
5L
6L
hL
?L
?L
?L
这是什么鬼啊?感觉是格式的问题,但是不知道怎么改。
...全文
714 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
PC_Z_666 2019-02-03
  • 打赏
  • 举报
回复
楼主,我最近在做一个个您差不多的项目,也是UDP接收底层板卡采集的AD数据,不知道您的问题解决了没有,希望和您交流一下~~~·
  • 打赏
  • 举报
回复
引用 7 楼 syb_love_jiexin 的回复:
[quote=引用 6 楼 南京短暂的春天 的回复:] [quote=引用 4 楼 syb_love_jiexin 的回复:] 2楼您好,最开始我就是用的QUdpSocket,新建线程,是可以做到接包存包,都没有问题,但是我用MATLAB解析数据包头,存在约0.1%的丢包,例如5万个数据包存一个 .dat 文件,会有几个十几个丢包,随机丢包,所以我才换的winsocket,迫不得已。用QUdpSocket我解决不了丢包的问题,不知道是我编的代码有问题,还是UDP协议的事。如果需要代码,我在粘上,我用的5.5.1版本的QT。
QUdpSocket的性能上肯定是满足的。你可以测试一下,不写文件的情况下,丢包率是多少。 问题应该出在你写文件的方式上。[/quote] 我试过测试不写文件时的丢包率,过程也是检测相邻两个包的包头,但是处理起来需要时间,这个时间应该是超过了两个包相邻的时间,导致出现问题,不知道您有没有什么好的检测方法?我也想想,再尝试测试一下,谢谢您的答复[/quote] 我建议,你的接收端的程序不要带界面,接收到的数据直接写入共享内存,让另一个程序去读取处理,不要加锁。
syb_love_jiexin 2018-12-10
  • 打赏
  • 举报
回复
引用 6 楼 南京短暂的春天 的回复:
[quote=引用 4 楼 syb_love_jiexin 的回复:]
2楼您好,最开始我就是用的QUdpSocket,新建线程,是可以做到接包存包,都没有问题,但是我用MATLAB解析数据包头,存在约0.1%的丢包,例如5万个数据包存一个 .dat 文件,会有几个十几个丢包,随机丢包,所以我才换的winsocket,迫不得已。用QUdpSocket我解决不了丢包的问题,不知道是我编的代码有问题,还是UDP协议的事。如果需要代码,我在粘上,我用的5.5.1版本的QT。

QUdpSocket的性能上肯定是满足的。你可以测试一下,不写文件的情况下,丢包率是多少。
问题应该出在你写文件的方式上。[/quote]

我试过测试不写文件时的丢包率,过程也是检测相邻两个包的包头,但是处理起来需要时间,这个时间应该是超过了两个包相邻的时间,导致出现问题,不知道您有没有什么好的检测方法?我也想想,再尝试测试一下,谢谢您的答复
  • 打赏
  • 举报
回复
引用 4 楼 syb_love_jiexin 的回复:
2楼您好,最开始我就是用的QUdpSocket,新建线程,是可以做到接包存包,都没有问题,但是我用MATLAB解析数据包头,存在约0.1%的丢包,例如5万个数据包存一个 .dat 文件,会有几个十几个丢包,随机丢包,所以我才换的winsocket,迫不得已。用QUdpSocket我解决不了丢包的问题,不知道是我编的代码有问题,还是UDP协议的事。如果需要代码,我在粘上,我用的5.5.1版本的QT。
QUdpSocket的性能上肯定是满足的。你可以测试一下,不写文件的情况下,丢包率是多少。 问题应该出在你写文件的方式上。
  • 打赏
  • 举报
回复
引用 9 楼 syb_love_jiexin 的回复:
[quote=引用 8 楼 南京短暂的春天 的回复:] [quote=引用 7 楼 syb_love_jiexin 的回复:] [quote=引用 6 楼 南京短暂的春天 的回复:] [quote=引用 4 楼 syb_love_jiexin 的回复:] 2楼您好,最开始我就是用的QUdpSocket,新建线程,是可以做到接包存包,都没有问题,但是我用MATLAB解析数据包头,存在约0.1%的丢包,例如5万个数据包存一个 .dat 文件,会有几个十几个丢包,随机丢包,所以我才换的winsocket,迫不得已。用QUdpSocket我解决不了丢包的问题,不知道是我编的代码有问题,还是UDP协议的事。如果需要代码,我在粘上,我用的5.5.1版本的QT。
QUdpSocket的性能上肯定是满足的。你可以测试一下,不写文件的情况下,丢包率是多少。 问题应该出在你写文件的方式上。[/quote] 我试过测试不写文件时的丢包率,过程也是检测相邻两个包的包头,但是处理起来需要时间,这个时间应该是超过了两个包相邻的时间,导致出现问题,不知道您有没有什么好的检测方法?我也想想,再尝试测试一下,谢谢您的答复[/quote] 我建议,你的接收端的程序不要带界面,接收到的数据直接写入共享内存,让另一个程序去读取处理,不要加锁。 [/quote] 好的好的,思路get到了,尝试一下,虽然有很多东西要现学习,但是十分感谢,之后再回复结果,希望您之后有时间还能关注[/quote] 在学校的这段时间是非常宝贵的,上班之后不是总有时间充电的。 希望你珍惜时间,学有所成。
syb_love_jiexin 2018-12-10
  • 打赏
  • 举报
回复
引用 8 楼 南京短暂的春天 的回复:
[quote=引用 7 楼 syb_love_jiexin 的回复:]
[quote=引用 6 楼 南京短暂的春天 的回复:]
[quote=引用 4 楼 syb_love_jiexin 的回复:]
2楼您好,最开始我就是用的QUdpSocket,新建线程,是可以做到接包存包,都没有问题,但是我用MATLAB解析数据包头,存在约0.1%的丢包,例如5万个数据包存一个 .dat 文件,会有几个十几个丢包,随机丢包,所以我才换的winsocket,迫不得已。用QUdpSocket我解决不了丢包的问题,不知道是我编的代码有问题,还是UDP协议的事。如果需要代码,我在粘上,我用的5.5.1版本的QT。

QUdpSocket的性能上肯定是满足的。你可以测试一下,不写文件的情况下,丢包率是多少。
问题应该出在你写文件的方式上。[/quote]

我试过测试不写文件时的丢包率,过程也是检测相邻两个包的包头,但是处理起来需要时间,这个时间应该是超过了两个包相邻的时间,导致出现问题,不知道您有没有什么好的检测方法?我也想想,再尝试测试一下,谢谢您的答复[/quote]
我建议,你的接收端的程序不要带界面,接收到的数据直接写入共享内存,让另一个程序去读取处理,不要加锁。
[/quote]
好的好的,思路get到了,尝试一下,虽然有很多东西要现学习,但是十分感谢,之后再回复结果,希望您之后有时间还能关注
  • 打赏
  • 举报
回复
不知道你是不是在校生。 你为什么不直接QUdpSocket。 把你的Qt版本说一下
syb_love_jiexin 2018-12-07
  • 打赏
  • 举报
回复
前几天发过一次,选择的板块不对,这回改回QT板块,希望大神们给予帮助,十分感谢
syb_love_jiexin 2018-12-07
  • 打赏
  • 举报
回复
3楼您好,主要是我接收的数据存进文件后不对,所以才打印出来看看。分析数组数据是指接收前分析吗?我不是很懂,麻烦了
syb_love_jiexin 2018-12-07
  • 打赏
  • 举报
回复
2楼您好,最开始我就是用的QUdpSocket,新建线程,是可以做到接包存包,都没有问题,但是我用MATLAB解析数据包头,存在约0.1%的丢包,例如5万个数据包存一个 .dat 文件,会有几个十几个丢包,随机丢包,所以我才换的winsocket,迫不得已。用QUdpSocket我解决不了丢包的问题,不知道是我编的代码有问题,还是UDP协议的事。如果需要代码,我在粘上,我用的5.5.1版本的QT。
kerwin liu 2018-12-07
  • 打赏
  • 举报
回复
char的数据你要分析数组数据,这么打印可能会存在乱码。

16,816

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧