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…

【算法刷题】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;推送通知&…

网站常用功能模块-鉴权

一&#xff1a;JWT是什么&#xff1f; 常用鉴权方式有很多种&#xff0c;今天主要介绍基于token的鉴权方式JWT&#xff08;Json JSON Web Token&#xff09;。因为这种方式实现起来方便快捷。整体实现逻辑如下 第一次登陆时&#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;…

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

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

党员学习交流平台

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

web实操9——session

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

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

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

Nginx:限流限速

1. 什么是限流限速? 限流限速是Nginx运维中一个非常重要的功能,用于防止服务器过载和保护资源免受滥用。它可以通过限制客户端的请求速率或上传/下载速度来实现。 限流:控制单位时间内允许处理的请求数量。这有助于防止过多的并发请求导致服务器性能下降或崩溃。限速:限制…

探索 JMeter While Controller:循环测试的奇妙世界

嘿&#xff0c;宝子们&#xff01;今天咱们就来聊聊 JMeter 里超级厉害的 While 控制器&#xff0c;它就像是一把神奇的钥匙&#xff0c;能帮我们打开循环测试的大门&#xff0c;模拟出各种各样复杂又有趣的场景哦&#xff01; 一、While 控制器初印象 想象一下&#xff0c;你…

迈向AGI,3、2、1,2025上链接!

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 往期精彩文章推荐 关于AI TIME AI TIME源起于2019年&#xff0c;旨在发扬科学思辨精神&#xff0c;邀请各界人士对人工智能理论、算法和场景应用的本质问题进行探索&#xff0c;加强思想碰撞&#xff0c;链接全…

JVM对象内存分配

1 栈上分配 栈空间随着方法执行完毕而回收通过栈上分配对象内存空间的方式&#xff0c;减少对堆空间的使用&#xff0c;从而减少gc的压力&#xff0c;提升程序性能 逃逸分析&#xff1a;分析对象的作用域&#xff0c;判断对象所需内存是否可以在栈上分配当对象没有被外部方法或…

计算机网络--路由器问题

一、路由器问题 1.计算下一跳 计算机网络--根据IP地址和路由表计算下一跳-CSDN博客 2.更新路由表 计算机网络--路由表的更新-CSDN博客 3.根据题目要求给出路由表 4.路由器收到某个分组&#xff0c;解释这个分组是如何被转发的 5.转发分组之路由器的选择 二、举个例子 …

vue 项目集成 electron 和 electron 打包及环境配置

vue electron 开发桌面端应用 安装 electron npm i electron -D记得加上-D&#xff0c;electron 需添加到devDependencies&#xff0c;如果添加到dependencies后面运行可能会报错 根目录创建electron文件夹&#xff0c;在electron文件夹创建main.js&#xff08;或者backgrou…

leecode1143.最长公共子序列

这道题目和最长重复子数组是一个类型的不同之处在于text1[i]!text2[j]时dp[i][j]时他的值是继承上一行或上一列的最大值&#xff0c;二者dp数组的含义也不一样&#xff0c;这里的dp[i][j]表示的是以text[i]和text2[j]为结尾的子序列最大长度&#xff0c;这也是导致两种问题当判…

通过 4 种方式快速将音乐从 iPod 传输到 Android

概括 在 iPod 上听音乐很酷&#xff0c;但是当您拥有最新的 Android 手机时&#xff0c;也许您想在新手机上欣赏 iPod 音乐。那么&#xff0c;你的计划是什么&#xff1f;如何将音乐从 iPod 传输到 Android&#xff1f; 如果您担心这个问题&#xff0c;请看看下面的方法。他们…

flutter在windows平台中运行报错

PS D:\F\luichun> flutter run当运行flutter项目时&#xff0c;【解决如下报错】 /C:/flutter/packages/flutter/lib/src/painting/star_border.dart:530:27: Error: The getter Matrix4 isnt defined for the class _StarGenerator.- _StarGenerator is from package:flut…

Docker Compose编排

什么是 Docker Compose? Docker Compose 是 Docker 官方推出的开源项目&#xff0c;用于快速编排和管理多个 Docker 容器的应用程序。它允许用户通过一个 YAML 格式的配置文件 docker-compose.yml 来定义和运行多个相关联的应用容器&#xff0c;从而实现对容器的统一管理和编…