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.mzph.cn/pingmian/66344.shtml

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

相关文章

<OS 有关> DOS 批处理命令文件,用于创建 python 虚拟机,并进入虚拟机状态执行后继命令 判断虚拟机是否存在,在批处理文件中自定义 虚拟机名字

前言&#xff1a; 经常要敲重复的命令&#xff1a; python -m venv venv.\venv\Scripts\activate.bat (虽然能按 Tab 省几下&#xff0c;多了也烦恼&#xff0c;后来写了四行脚本 start.bat) DOS批处理 create_venv_start.bat 功能&#xff1a; 批处理显示支持中文在 creat…

[python3]Excel解析库-openpyxl

https://openpyxl.readthedocs.io/en/stable/ openpyxl 是一个用于读写 Excel 2010 xlsx/xlsm/xltx/xltm 文件的 Python 库。它允许开发者创建、修改和保存电子表格&#xff0c;而无需依赖 Microsoft Excel 软件本身。openpyxl 支持读取和写入 Excel 的工作簿&#xff08;Work…

【算法刷题】leetcode hot 100 哈希篇

文章目录 1. 两数之和49. 字母异位词分组128. 最长连续序列总结 1. 两数之和 leetcode&#xff1a;https://leetcode.cn/problems/two-sum/description/?envTypestudy-plan-v2&envIdtop-100-liked暴力解决&#xff1a; public int[] twoSum(int[] nums, int target) {for …

iOS 逆向学习 - iOS Architecture Cocoa Touch Layer

iOS 逆向学习 - iOS Architecture Cocoa Touch Layer 一、Cocoa Touch Layer 简介二、Cocoa Touch Layer 的核心功能1. UIKit2. Event Handling&#xff08;事件处理&#xff09;3. Multitasking&#xff08;多任务处理&#xff09;4. Push Notifications&#xff08;推送通知&…

java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter

今天在朋友机子上运行代码&#xff0c;在生成token的时候&#xff0c;遇到了这样一个问题&#xff1a; Caused by: java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter at io.jsonwebtoken.impl.Base64Codec.decode(Base64Codec.java:26) ~[jjwt-0.9.1.jar:0.…

从0搭建DataSphereStudio保姆级教程--复制粘贴即用(hadoop2.7.2、hive2.3.3、spark2.4.5)

centos7 部署Hadoop 2.7.2 前置&#xff1a;配置好免密登录 1、安装JDK1.8 yum -y install java-1.8.0-openjdk*#验证 java -version2、下载Hadoop2.7.2安装包及解压(可提前下载好直接上传&#xff09; mkdir /opt/server mkdir /opt/software cd /opt/software wget http:…

网站常用功能模块-鉴权

一&#xff1a;JWT是什么&#xff1f; 常用鉴权方式有很多种&#xff0c;今天主要介绍基于token的鉴权方式JWT&#xff08;Json JSON Web Token&#xff09;。因为这种方式实现起来方便快捷。整体实现逻辑如下 第一次登陆时&#xff0c;前端携带账号和密码请求登录接口。服务…

Colyseus 与 HTTP API 的集成

Colyseus 与 HTTP API 的集成 在使用 Colyseus 开发实时多人应用时&#xff0c;通常需要与传统的 HTTP API 集成&#xff0c;例如用户身份验证、存储游戏数据、获取排行榜等。以下是 Colyseus 与 HTTP API 集成的详细介绍&#xff1a; 1. Colyseus 的基本架构 Colyseus 是一个…

asp.net core mvc的 ViewBag , ViewData , Module ,TempData

在 ASP.NET MVC 和 ASP.NET Core MVC 中&#xff0c;ViewBag 和 ViewData 是两种用于将数据从控制器传递到视图&#xff08;View&#xff09;的常用方法。它们都允许控制器将动态数据传递给视图&#xff0c;但它们的实现方式有所不同。关于 Module&#xff0c;它通常指的是某种…

stm32的掉电检测机制——PVD

有时在一些应用中&#xff0c;我们需要检测系统是否掉电了&#xff0c;或者要在掉电的瞬间需要做一些处理。 STM32内部自带PVD功能&#xff0c;用于对MCU供电电压VDD进行监控。 STM32就有这样的掉电检测机制——PVD(Programmable Voltage Detecter)&#xff0c;即可编程电压检…

Flink系列知识讲解之:深入了解 Flink 的网络协议栈

Flink系列知识之&#xff1a;深入了解 Flink 的网络协议栈 Flink 的网络协议栈是组成 flink-runtime 模块的核心组件之一&#xff0c;也是每个 Flink 任务的核心。它连接着来自所有任务管理器的各个工作单元&#xff08;子任务&#xff09;。这是流数据流过的地方&#xff0c;…

uni-app 多平台分享实现指南

uni-app 多平台分享实现指南 在移动应用开发中&#xff0c;分享功能是一个非常常见的需求&#xff0c;尤其是在社交媒体、营销活动等场景中。使用 uni-app 进行多平台开发时&#xff0c;可以通过一套代码实现跨平台的分享功能&#xff0c;涵盖微信小程序、H5、App 等多个平台。…

基于深度学习的视觉检测小项目(六) 项目的信号和变量的规划

• 关于前后端分离 当前流行的一种常见的前后端分离模式是vueflask&#xff0c;vueflask模式的前端和后端之间进行数据的传递通常是借助 API&#xff08;应用程序编程接口&#xff09;来完成的。vue通过调用后端提供的 API 来获取或提交数据。例如&#xff0c;前端可能通过发送…

机器视觉面试题PDF

以下是一些机器视觉面试题PDF资源的推荐&#xff1a; GitHub仓库• 《百面计算机视觉》面试题整理&#xff1a;这个GitHub仓库整理了计算机视觉算法岗的面试题&#xff0c;包括深度学习基础、机器学习高频面试题、传统CV(Opencv面试题)、目标检测、图像分类、图像分割、Transfo…

Python自学 - 递归函数

1 Python自学 - 递归函数 递归函数是一种在函数体内调用自己的函数&#xff0c;就像“左脚踩着右脚&#xff0c;再右脚踩着左脚… 嗯&#xff0c;你就可以上天了&#xff01;”。递归函数虽然不能上天&#xff0c;但在处理某些场景时非常好用&#xff0c; 一种典型的场景就是遍…

党员学习交流平台

本文结尾处获取源码。 本文结尾处获取源码。 本文结尾处获取源码。 一、相关技术 后端&#xff1a;Java、JavaWeb / Springboot。前端&#xff1a;Vue、HTML / CSS / Javascript 等。数据库&#xff1a;MySQL 二、相关软件&#xff08;列出的软件其一均可运行&#xff09; I…

华为 Sensor 省电策略调研

华为EMUI 9.0.0.187&#xff08;C00E57R1P15&#xff09; 无该功能 华为EMUI 9.1.0.321&#xff08;C00E320R1P1&#xff09; 之后有sensor管控 一、华为 Sensor 省电策略 1. Sensor 类别只配置非唤醒类Sensor 2. 手机静止情况&#xff0c;应用不可见时达到1分钟&#xff0…

web实操9——session

概念 数据保存在服务器HttpSession对象里。 session也是域对象&#xff0c;有setAttribute和getAttribute方法 快速入门 代码 获取session和塞入数据&#xff1a; 获取session获取数据&#xff1a; 请求存储&#xff1a; 请求获取&#xff1a; 数据正常打印&#xff1a…

Unity的四种数据持久化方式

目录 什么是数据持久化 数据持久化之PlayerPrefs 概述 API及用法 电脑中存放的位置 优缺点 主要用处 封装PlayerPrefs 数据持久化之XML XML是什么 读取XML信息 C#读取XML的方法有几种 读取xml文件信息 读取元素和属性信息 总结 写入XML信息 选择存储目录 存储…

面向对象分析和设计OOA/D,UML,GRASP

目录 什么是分析和设计&#xff1f; 什么是面向对象的分析和设计&#xff1f; 迭代开发 UML 用例图 交互图 基于职责驱动设计 GRASP 常见设计原则 什么是分析和设计&#xff1f; 分析&#xff0c;强调是对问题和需求的调查研究&#xff0c;不是解决方案。例如&#x…