当前位置: 首页 > article >正文

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

前言

一个由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.kler.cn/a/466837.html

相关文章:

  • VScode SSH 错误:Got bad result from install script 解決
  • Vue3苦逼的学习之路
  • 连接Milvus
  • Tailwind CSS 使用简介
  • RabbitMQ实现生产者消费者
  • Conda 安装 Jupyter Notebook
  • [redux] ts声明useSelector和useDispatch
  • 嵌入式 Linux LED 驱动开发实验
  • 运维工具汇总
  • 【数据分析实战】24年T4某二手车交易平台数据分析
  • 【机器学习】【朴素贝叶斯分类器】从理论到实践:朴素贝叶斯分类器在垃圾短信过滤中的应用
  • 【数据库】简答题汇总
  • 力扣28找出字符串中第一个匹配项的下标
  • PyTorch中的__init__.pyi文件:作用与C++实现关系解析
  • 《探秘开源大模型:AI 世界的“超级引擎”》
  • Github 2024-12-30 开源项目周报 Top15
  • Chrome浏览器实例的TypeScript自动化脚本
  • Uniapp跨域请求
  • ​​​​​​​CDP集群安全指南系列文章导读
  • 无人机解码物流配送技术详解
  • ReactiveStreams、Reactor、SpringWebFlux
  • 【深度学习遥感应用中的“信息”】空间信息、语义信息、纹理信息、边缘信息、表层信息、深层信息...
  • 探索 AIGC 的基础知识:人工智能生成内容的全景视图
  • 深入解析与实践:MySQL
  • React实现长列表
  • python的reload