QT,利用UDP接收数据包,每当收到100个数据包建立一个文件存储,文件名以系统时间命名

syb_love_jiexin 2018-09-25 04:36:36
这是自己参考网上UDP接收数据包写的代码,发现只能在第一个文件中存进去数据,第二个文件可以建立成功,但写不进去数据,请大神们帮忙看看,或者帮忙换一个思路,谢谢各位。
下面是进程的 .h文件和 .cpp文件。
#ifndef STORE_H
#define STORE_H
#include <QThread>
#include <QtCore>
#include <QObject>
#include <QMutex>
#include <iostream>
#include <QtNetwork>

class QUdpSocket;
class store : public QThread
{
public:
store();

private slots:
void run();
void processPendingDatagram();

private:
QMutex m_lock;
QUdpSocket *receiver;
QFile f();

};

#endif // STORE_H


#include "store.h"
#include <iostream>

store::store()
{
//创建一个QUdpSocket类对象,该类提供了Udp的许多相关操作
receiver = new QUdpSocket(this);
int port = 45454;//设置UDP的端口号参数,指定在此端口上监听数据
//此处的bind是个重载函数,连接本机的port端口,采用ShareAddress模式(即允许其它的服务连接到相同的地址和端口,特别是
//用在多客户端监听同一个服务器端口等时特别有效),和ReuseAddressHint模式(重新连接服务器)
int receive = receiver->bind(QHostAddress("192.168.0.3"),port);
if(receive != -1)
{qDebug() << "UDP Connected Succeed ! ";}
else
{qDebug() << "UDP Connected Faild ! ";}
}

void store::run()
{
//获得系统时间并输出
QString min = QDateTime::currentDateTime().toString("yyyyMMddhhmmss");
//打开文本 以时间命名文件名字
QString fileName = "C:\\" + min + ".txt";
QFile f(fileName);
if(!f.open( QIODevice::WriteOnly | QIODevice::Text))
return;
int i=1;
while(1)
{
while(receiver->hasPendingDatagrams()) //拥有等待的数据报
{
QByteArray datagram; //拥于存放接收的数据报
datagram.resize(receiver->pendingDatagramSize());
receiver->readDatagram(datagram.data(),datagram.size());
QString HexData = datagram.toHex();

if(i % 100 == 0)
{
f.close();
//获得系统时间并输出
QString min = QDateTime::currentDateTime().toString("yyyyMMddhhmmss");
qDebug() << "write again !";
QString fileName = "C:\\" + min + ".txt";
QFile f(fileName);
if(!f.open( QIODevice::WriteOnly | QIODevice::Text))
return;
f.flush();
}

QTextStream put(&f);
put << HexData ;
i = i + 1;


}
}
}
/***********GNSS数据处理***********/
void store::processPendingDatagram()
{

}

...全文
444 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
syb_love_jiexin 2018-09-25
  • 打赏
  • 举报
回复
十分感谢,试了一下,可以了,还没看中间有没有丢包,如果没有简直是完美了。谢谢
syb_love_jiexin 2018-09-25
  • 打赏
  • 举报
回复
再次感谢,我试一下
@风轻云淡_ 2018-09-25
  • 打赏
  • 举报
回复

if(i % 100 == 0)
{
f.close();
//获得系统时间并输出
QString min = QDateTime::currentDateTime().toString("yyyyMMddhhmmss");
qDebug() << "write again !";
QString fileName = "C:\\" + min + ".txt";
/*QFile f(fileName); 修改为*/ f.setFileName(fileName);
if(!f.open( QIODevice::WriteOnly | QIODevice::Text))
return;
f.flush();
}


syb_love_jiexin 2018-09-25
  • 打赏
  • 举报
回复
首先谢谢您的解答。
您说的我明白,知道是这个原因,但是不知道怎么解决,您能明白我想干啥吧!能提供一下解决意见吗?自己不知道怎么处理了。
如果第二个文件及以后的文件命名不用“f”,换一个其他的,那么
QTextStream put(&f);
put << HexData ;
就没有用了,也得随着改变,就很矛盾
@风轻云淡_ 2018-09-25
  • 打赏
  • 举报
回复

QString fileName = "C:\\" + min + ".txt";
QFile f(fileName);f是个局部变量,出了大括号作用域就没意义了,并且你外面也有个f,我想你可能是把外面的和里面的弄混了吧,建议是你把里面的f定义去掉,然后改成初始化外面的f。你的命名有点随意。。。
@风轻云淡_ 2018-09-25
  • 打赏
  • 举报
回复

里面的f在失去作用之后,
QTextStream put(&f);
put << HexData ;
这里你实际是使用的第一个f,文件名一直是原来那一个,所以从始至终就只写数据在一个文件,第二个文件只新建没有数据的原因就是在这。

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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