参考网上资料,在“利用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
这是什么鬼啊?感觉是格式的问题,但是不知道怎么改。