Qt窗口获取Tftpd32_svc服务下载信息

news2025/1/7 21:15:34

前言

一个由Qt开发的Windows小工具需要布置Tftp协议服务端来支持设备下载数据,并显示下载列表(进度、下载源等)。
考虑开发方便,优先使用了Qtftp方案,经测试发现,不够稳定,会有下载超时的情况,故重新选择使用Tftpd64方案。

Tftpd64

地址

官网地址
安装包地址
源码地址

问题描述

源码未提供Tftpd二次开发api,无法直接使用Tftpd64获取下载进度等信息。
阅读源码分析如下:

  • 将Tftp协议移植出来工作量太大,暂否决
  • tftpd32 service edition 服务与UI分离,进程间通讯采用TCP协议,尝试使用此方案

Qt窗口代码实现

	if (!initConnect())
	{
		qCritical("initConnect fail");
		return;
	}

	Sleep(100);
	char path[] = "D:\\Work\\resource";
	sendMsg(C_TFTP_CHG_WORKING_DIR, path, strlen(path)+1);

	//sendMsg(C_RRQ_WORKING_DIR, "", 1);

	m_isRun = true;
	while (m_isRun)
	{
		struct S_ConsoleMsg sMsg;

		if (!tcpPPRecv((char*)&sMsg, sizeof(sMsg)))
		{
			qWarning("");
			continue;
		}

		switch (sMsg.type)
		{
		case C_ERROR:
			qInfo("C_ERROR");
			break;

		case C_WARNING:
			qInfo("C_WARNING");
			break;

		case C_TFTP_TRF_NEW:
		{
			const S_TftpTrfNew& newTrf = sMsg.u.trf_new;
			qInfo("---------C_TFTP_TRF_NEW-----------");

			char addr[16] = { 0 };
			getnameinfo((LPSOCKADDR)&newTrf.from_addr, sizeof(newTrf.from_addr),
				addr, sizeof addr,
				NULL, 0,
				NI_NUMERICHOST);

			qInfo("addr: %s", addr);
			qInfo("dwTransferId: %d", newTrf.dwTransferId);
			qInfo("szFile: %s", newTrf.szFile);
			qInfo("dwTransfert: %d", newTrf.stat.dwTransfert);
			qInfo("dwTotalBytes: %d", newTrf.stat.dwTotalBytes);
			qInfo("dwTotalTimeOut: %d", newTrf.stat.dwTotalTimeOut);
			qInfo("dwTransferSize: %d", newTrf.stat.dwTransferSize);
			qInfo("StartTime: %d", newTrf.stat.StartTime);
			qInfo("dLastUpdate: %d", newTrf.stat.dLastUpdate);
			qInfo("ret_code: %d", newTrf.stat.ret_code);

			emit AppEvent::Instance()->sig_tftpNew(newTrf.dwTransferId, addr, newTrf.szFile);
			break;
		}
		case C_TFTP_TRF_END:
		{
			const S_TftpTrfEnd& endTrf = sMsg.u.trf_end;
			qInfo("---------C_TFTP_TRF_END-----------");
			qInfo("dwTransferId: %d", endTrf.dwTransferId);
			qInfo("dwTransfert: %d", endTrf.stat.dwTransfert);
			qInfo("dwTotalBytes: %d", endTrf.stat.dwTotalBytes);
			qInfo("dwTotalTimeOut: %d", endTrf.stat.dwTotalTimeOut);
			qInfo("dwTransferSize: %d", endTrf.stat.dwTransferSize);
			qInfo("StartTime: %d", endTrf.stat.StartTime);
			qInfo("dLastUpdate: %d", endTrf.stat.dLastUpdate);
			qInfo("ret_code: %d", endTrf.stat.ret_code);

			emit AppEvent::Instance()->sig_tftpEnd(endTrf.dwTransferId);
			break;
		}

		case C_TFTP_TRF_STAT:
		{
			qInfo("---------C_TFTP_TRF_STAT-----------");
			const S_TftpTrfStat& statTrf = sMsg.u.trf_stat;
			for (int i = 0; i < statTrf.nbTrf; i++)
			{
				qInfo("dwTransferId: %d", statTrf.t[i].dwTransferId);
				qInfo("dwTransfert: %d", statTrf.t[i].stat.dwTransfert);
				qInfo("dwTotalBytes: %d", statTrf.t[i].stat.dwTotalBytes);
				qInfo("dwTotalTimeOut: %d", statTrf.t[i].stat.dwTotalTimeOut);
				qInfo("dwTransferSize: %d", statTrf.t[i].stat.dwTransferSize);
				qInfo("StartTime: %d", statTrf.t[i].stat.StartTime);
				qInfo("dLastUpdate: %d", statTrf.t[i].stat.dLastUpdate);
				qInfo("ret_code: %d", statTrf.t[i].stat.ret_code);

				emit AppEvent::Instance()->sig_tftpProgress(statTrf.t[i].dwTransferId, 
					statTrf.t[i].stat.dwTotalBytes*100/ statTrf.t[i].stat.dwTransferSize);
			}
			break;
		}

		default:
			qInfo("__-------------%d----------", sMsg.type);
			break;
		}
	}

效果图

在这里插入图片描述

demo下载地址

下载地址

在此记录只为交流学习,未有其它意图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2272207.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

合合信息亮相CSIG AI可信论坛,全面拆解AI视觉内容安全的“终极防线”

合合信息亮相CSIG AI可信论坛&#xff0c;全面拆解视觉内容安全的“终极防线”&#xff01; &#x1f42f; AI伪造泛滥&#xff0c;我们还能相信“眼见为实”吗&#xff1f; 近期&#xff0c;由中国图象图形学学会主办的CSIG青年科学家会议 AI可信论坛在杭州成功举办。本次论…

Bash Shell的操作环境

目录 1、路径与指令搜寻顺序 2、bash的进站&#xff08;开机&#xff09;与欢迎信息&#xff1a;/etc/issue&#xff0c;/etc/motd &#xff08;1&#xff09;/etc/issue &#xff08;2&#xff09;/etc/motd 3、bash的环境配置文件 &#xff08;1&#xff09;login与non-…

如何在没有 iCloud 的情况下将联系人从 iPhone 传输到 iPhone

概括 近期iOS 13.5的更新以及苹果公司发布的iPhone SE在众多iOS用户中引起了不小的轰动。此外&#xff0c;不少变化&#xff0c;如暴露通知 API、Face ID 增强功能以​​及其他在 COVID-19 期间与公共卫生相关的新功能&#xff0c;吸引了 iPhone 用户尝试新 iPhone 并更新到最…

网站设计总结后期维护与更新的重要性

当我们谈论网站设计时&#xff0c;往往会聚焦在初始阶段的创意和实现上。然而&#xff0c;一旦网站建成并上线&#xff0c;后期维护与更新的重要性就显得尤为突出。一个网站的成功不仅取决于其初始设计&#xff0c;更在于持续的维护与更新。 首先&#xff0c;后期维护能够确保网…

Android NDK开发实战之环境搭建篇(so库,Gemini ai)

文章流程 音视频安卓开发首先涉及到ffmpeg编译打包动态库&#xff0c;先了解动态库之间的cpu架构差异性。然后再搭建可运行的Android 环境。 So库适配 ⽇常开发我们经常会使⽤到第三库&#xff0c;涉及到底层的语⾳&#xff0c;视频等都需要添加so库。⽽so库的体积⼀般来说 ⾮…

数据仓库中的指标体系模型介绍

数据仓库中的指标体系介绍 文章目录 数据仓库中的指标体系介绍前言什么是指标体系指标体系设计有哪些模型?1. 指标分层模型2. 维度模型3. 指标树模型4. KPI&#xff08;关键绩效指标&#xff09;模型5. 主题域模型6.平衡计分卡&#xff08;BSC&#xff09;模型7.数据指标框架模…

unity学习11:地图相关的一些基础

目录 1 需要从 unity的 Asset Store 下载资源 1.1 下载资源 1.2 然后可以从 package Manager 里选择下载好的包&#xff0c;import到项目里 2 创建地形 2.1 创建地形 2.2 地形 Terrain大小 2.3 各种网格的尺寸大小 2.4 比较这个地形尺寸和创建的其他物体的大小对比 3 …

jenkins入门--安装jenkins

下载地址https://www.jenkins.io/ jdk 安装 &#xff1a;Jenkins需要安装对应版本的jdk,我在安装过程中显示需要21,17 Java Downloads | Oracle jenkins安装过程参考全网最清晰Jenkins安装教程-windows_windows安装jenkins-CSDN博客 安装完成后&#xff0c;浏览器输入127.0.…

第0章 机器人及自动驾驶SLAM定位方法全解析及入门进阶学习建议

嗨&#xff0c;各位同学大家好&#xff01;笔者自985硕士毕业后&#xff0c;在机器人算法领域已经深耕 7 年多啦。这段时间里&#xff0c;我积累了不少宝贵经验。本专栏《机器人工程师带你从零入门SLAM》将结合下面的SLAM知识体系思维导图及多年的工作实战总结&#xff0c;将逐…

springCloud 脚手架项目功能模块:Java分布式锁

文章目录 引言分布式锁产生的原因:集群常用的分布式锁分布式锁的三种实现方式I ZooKeeper 简介zookeeper本质上是一个分布式的小文件存储系zookeeper特性:全局数据一致性ZooKeeper的应用场景分布式锁(临时节点)II 基于ZooKeeper 实现一个排他锁创建锁获取锁释放锁Apache Zo…

如何配置【Docker镜像】加速器+【Docker镜像】的使用

一、配置Docker镜像加速器 1. 安装/升级容器引擎客户端​ 推荐安装1.11.2以上版本的容器引擎客户端 2. 配置镜像加速器​ 针对容器引擎客户端版本大于1.11.2的用户 以root用户登录容器引擎所在的虚拟机 修改 "/etc/docker/daemon.json" 文件&#xff08;如果没有…

Docker- Unable to find image “hello-world“locally

Docker- Unable to find image “hello-world“locally 文章目录 Docker- Unable to find image “hello-world“locally问题描述一. 切换镜像1. 编辑镜像源2. 切换镜像内容 二、 检查设置1、 重启dockers2、 检查配置是否生效3. Docker镜像源检查4. Dokcer执行测试 三、自定义…

go项目zero框架中用gentool解决指定MYSQL表生成结构体被覆盖的解决方案

在使用 GoZero 框架进行项目开发时&#xff0c;gentool 是一个非常方便的工具&#xff0c;它可以根据数据库表结构自动生成 Go 语言结构体和其他相关文件。然而&#xff0c;在使用 gentool 生成结构体时&#xff0c;可能会遇到一个问题&#xff1a;如果多次运行 gentool&#x…

深入Android架构(从线程到AIDL)_11 线程之间的通信架构

目录 5、 线程之间的通信架构 认识Looper与Handler对象 主线程丢信息给自己 子线程丢信息给主线程 替子线程诞生Looper与MQ 5、 线程之间的通信架构 认识Looper与Handler对象 当主线程诞生时&#xff0c;就会去执行一个代码循环(Looper)&#xff0c;以便持续监视它的信息…

今日自动化编辑部今日自动化杂志社2024年第19期部分目录

智能控制技术 无人机视觉支持下的输电线路安全距离巡检系统探究 贺凌飞 王骋昊1-2,36 基于虚拟现实技术的安全警示系统设计 黄奇 李光辉 徐奎 许兆辉3-5 火焰自动焊接技术对泄漏率的影响研究 孙天鸽5-7 PLC在闸门自动化控制系统中的应用 黎芳8-9,23 智能控制算法在二次供水系统…

【双层模型】考虑供需双侧的综合能源双层优化模型

目录 主要内容 内容研究 1.模型简介 2 程序释义 部分代码 运行结果 下载链接 主要内容 该程序实现一个综合能源系统的优化调度双层模型&#xff0c;上下层分别采用差分进化算法和规划算法进行求解。模型考虑了多种能源设备&#xff0c;包括燃气轮机、燃气锅炉、风电…

单片机-串转并-74HC595芯片

1、74HC595芯片介绍 74HC595 是一个 8 位串行输入、并行输出的位移缓存器&#xff0c;其中并行输出为三态输出&#xff08;即高电平、低电平和高阻抗&#xff09;。 15 和 1 到 7 脚 QA--QH&#xff1a;并行数据输出 9 脚 QH 非&#xff1a;串行数据输出 10 脚 SCLK 非&#x…

(框架漏洞)

1.Thinkphp 1.Thinkphp5x远程命令执⾏及getshell 搭建靶场环境 vulhub/thinkphp/5-rce docker-compose up -d #启动环境 ?sindex/think\app/invokefunction&functioncall_user_func_array&vars[0]system&vars[1][]whoami ?s/Index/\think\app/invokefunctio…

[SMARTFORMS] 输出文本变量绑定

在SMARTFORMS表单中的表格接口的"导入"页签处添加导入参数IV_EBELN 参数IV_EBELN为采购凭证编号&#xff0c;并为该参数添加默认值 在SMARTFORMS表单中的全局定义中的"全局数据"页签定义变量 结构ZSPO_HEADER_437、ZSPO_ITEM_437与表类型ZTPO_ITEM_437的定…

【DevOps】Jenkins部署

Jenkins部署 文章目录 Jenkins部署资源列表基础环境一、部署Gilab1.1、安装Gitlab1.2、修改配置文件1.3、加载配置文件1.4、访问Gitlab1.5、修改root登录密码1.6、创建demo测试项目1.7、上传代码1.8、验证上传的代码 二、部署Jenkins所需软件2.1、部署JDK2.2、部署Tomcat2.3、部…