TFT通信协议解析与应用
TFTP(Trivial File Transfer Protocol)是一种简单的文件传输协议,常用于在本地网络上的设备之间传输小型文件。
通信大致过程
TFTP通信过程如下:
-
TFTP通信双方建立连接:TFTP客户端与TFTP服务器建立连接。TFTP服务器监听69号端口,TFTP客户端使用任意端口向服务器发起连接请求。
-
TFTP客户端发送请求:客户端向服务器发送读/写请求,请求读取或写入文件。请求消息包含文件名和传输模式(读或写)等参数。
-
TFTP服务器响应请求:服务器接收到请求后,发送相应的数据包。如果是读请求,服务器会发送一个包含文件数据的数据包;如果是写请求,服务器会发送一个确认数据包。
-
TFTP客户端处理数据:客户端收到服务器发送的数据包后,处理数据,如果是写请求,则发送一个数据确认包;如果是读请求,则请求下一批数据。
-
TFTP服务器处理数据:服务器接收到客户端发送的确认数据包后,继续发送数据包,直到所有数据传输完成。
-
TFTP连接关闭:当数据传输完成后,TFTP连接会自动关闭。
通信报文解析
TFTP报文格式:
TFTP报文格式包括操作码、数据块号和数据三个部分。
操作码:每条TFTP报文的第一个字节是操作码,用于标识该报文的类型,包括读请求、写请求、数据报文、确认报文、错误报文等。
数据块号:在数据报文和确认报文中,数据块号用来表示传输的数据块的编号,一个传输的文件被分成多个数据块进行传输,每个数据块有一个独立的数据块编号。
数据:在数据报文中,数据是传输的文件数据;在确认报文中,数据是上一数据块的数据块编号。
总体来说,TFTP通信过程简单明了,适合于在局域网内传输小型文件。由于TFTP没有安全措施,因此不适合在互联网上使用。
以下是一个tftp client的几个重要函数:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netdb.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <fcntl.h>#define PACKET_SIZE 516
#define PORT 69typedef enum {RRQ = 1,WRQ = 2,DATA = 3,ACK = 4,ERROR = 5
} Opcode;typedef struct {Opcode opcode;char* filename;char* mode;
} Request;typedef struct {Opcode opcode;int block_num;char* data;
} DataPacket;typedef struct {Opcode opcode;int block_num;
} AckPacket;typedef struct {Opcode opcode;char* error_msg;
} ErrorPacket;int send_request(int sockfd, Request req, struct sockaddr_in serv_addr) {char packet[PACKET_SIZE];int ptr = 0;memset(packet, 0, PACKET_SIZE);// Opcodepacket[ptr++] = 0;packet[ptr++] = req.opcode;// Filenamememcpy(packet + ptr, req.filename, strlen(req.filename) + 1);ptr += strlen(req.filename) + 1;// Modememcpy(packet + ptr, req.mode, strlen(req.mode) + 1);ptr += strlen(req.mode) + 1;return sendto(sockfd, packet, ptr, 0, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
}int receive_data(int sockfd, DataPacket* data_pkt, struct sockaddr_in* serv_addr, socklen_t* addr_len) {char packet[PACKET_SIZE];int bytes_received = recvfrom(sockfd, packet, PACKET_SIZE, 0, (struct sockaddr*)serv_addr, addr_len);if (bytes_received < 0) {perror("Error receiving data");return -1;}// Parse packetint ptr = 0;data_pkt->opcode = packet[ptr++];data_pkt->block_num = (packet[ptr++] << 8) + packet[ptr++];data_pkt->data = (char*)malloc(bytes_received - 4);memcpy(data_pkt->data, packet + 4, bytes_received - 4);return bytes_received - 4;
}int send_ack(int sockfd, AckPacket ack_pkt, struct sockaddr_in serv_addr) {char packet[PACKET_SIZE];int ptr = 0;memset(packet, 0, PACKET_SIZE);// Opcodepacket[ptr++] = 0;packet[ptr++] = ack_pkt.opcode;// Block numberpacket[ptr++] = (ack_pkt.block_num & 0xff00) >> 8;packet[ptr++] = ack_pkt.block_num & 0xff;return sendto(sockfd, packet, ptr, 0, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
}int send_error(int sockfd, ErrorPacket err_pkt, struct sockaddr_in serv_addr) {char packet[PACKET_SIZE];int ptr = 0;memset(packet, 0, PACKET_SIZE);// Opcodepacket[ptr++] = 0;packet[ptr++] = err_pkt.opcode;// Error messagememcpy(packet + ptr, err_pkt.error_msg, strlen(err_pkt.error_msg) + 1);ptr += strlen(err_pkt.error_msg) + 1;return sendto(sockfd, packet, ptr, 0, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
}``
【最后一个bug】多平台都有更新和发布,大家可以一键三连,关注+星标,不错过精彩内容~~

相关文章:
TFT通信协议解析与应用
TFTP(Trivial File Transfer Protocol)是一种简单的文件传输协议,常用于在本地网络上的设备之间传输小型文件。 通信大致过程 TFTP通信过程如下: TFTP通信双方建立连接:TFTP客户端与TFTP服务器建立连接。TFTP服务器监…...

python 操作word库docx 增强接口
前言用python 的docx 库操作word完成一些自动化的文档生成工作,但有时候会遇到docx库提供的操作无法直接满足业务上的需求,需要对其进行一些扩展。接口完善实现在指定的文字后面插入指定的文字任务:以下示例需要在文档中的所有 "人生苦短…...

ARM uboot 源码分析9 - uboot的硬件驱动部分
一、uboot 与 linux 驱动 1、uboot 本身是裸机程序 (1) 裸机本来是没有驱动的概念的(狭义的驱动的概念就是,操作系统中用来具体操控硬件的那部分代码叫驱动) (2) 裸机程序中是直接操控硬件的,操作系统中必须通过驱动来操控硬件…...

Mybatis动态sql语句foreach中拼接正则表达式字符串注意事项
今天要说到的查询情况,平时项目里边其实用到的并不是很多,使用正则表达式无非是为了匹配结果比较灵活,最常见的,我们的查询条件一般一个参数仅仅只是一种情况的筛选,对于如何选择查询方式,主要还是要看前端…...

JVM内置锁synchronized关键字详解
目录 JVM内置锁synchronized关键字详解 设计同步器的意义 如何解决线程并发安全问题? synchronized原理详解 synchronized底层原理 synchronized在jdk1.6前后的变化【重点】 jdk小于1.6时 jdk>1.6时 轻量级锁何时升级为重量级锁??…...

【2021.12.25】xv6系统入门学习
【2021.12.28】为xv6系统添加一个开机密码 文章目录【2021.12.28】为xv6系统添加一个开机密码0、说明1、Ubuntu20上安装xv62、测试指令3、修改系统代码4、添加自己的程序命令0、说明 xv6 是 MIT 设计的一个教学型操纵系统。 记录Ubuntu上安装x86版本的xv6系统,为其…...
Linux内核4.14版本——drm框架分析(4)——crtc分析
目录 1. struct drm_crtc结构体 2. crtc相关的API 2.1 drm_crtc_init_with_planes 2.5 drm_mode_setcrtc 3. func的一些介绍 3.1 struct drm_crtc_helper_funcs 3.2 struct drm_crtc_funcs 4. 应用层的调用 4.1 drmModeSetCrtc (drmlib库里)---…...

用原生js手写分页功能
分页功能如下: 数据分页显示,每页显示若干条数据,默认当前页码为第一页。例如:每页5条数据,则第一页显示 1-5 条,第二页显示 6-10 条,依此类推。当页码为第一页时,上一页为禁用状态…...

CornerNet介绍
CornerNet: Detecting Objects as Paired Keypoints ECCV 2018 Paper:https://arxiv.org/pdf/1808.01244v2.pdf Code:GitHub - princeton-vl/CornerNet 摘要: 提出了一种single-stage的目标检测算法CornerNet,它把每个目标检…...
【SpringBoot】日志使用
默认配置 Spring Boot默认帮我们配置好了日志 //记录器Logger logger LoggerFactory.getLogger(getClass());Testpublic void contextLoads() {//System.out.println();//日志的级别;//由低到高 trace<debug<info<warn<error//可以调整输出的日志级…...
关于slice扩容性能损耗的探究
背景 如果让我评选最伟大的数据结构,在我心中答案只有两个,数组和哈希表,这两个是我的程序的重要组成部分,同时也是我饭碗的重要组成部分。slice和map简洁明了的API很容易让我们有一种他们提供了无限大的空间,可以…...

Java实现单向链表
✅作者简介:热爱Java后端开发的一名学习者,大家可以跟我一起讨论各种问题喔。 🍎个人主页:Hhzzy99 🍊个人信条:坚持就是胜利! 💞当前专栏:Java数据结构与算法 ǹ…...
3月4日,30秒知全网,精选7个热点
///印度最大供电商罕见于现货市场购煤,能源供应短缺成忧 据知情人士透露,这家印度国有发电公司计划在下周左右发布300万吨的招标 ///QQ音乐推出AIGC黑胶播放器 这是国内音乐行业首个运用AI技术,通过文字、图片指令快速生成不同风格的播放器…...

EXCEL-职业版本(2)
Excel-职业版本(2) 定位 1.如何快速定位到不连续的空值,填充为0 1.在任意空单元格里复制0 2.选中数据区域CtrlA 3.CtrlG 4.选择【定位条件】 5.选择【空值】 6.ctrlV 粘贴 即可 2.怎么一次性计算每个小组的数量 单价和金额的和? 1.选中…...
java中延时队列的实现
大家好,我是一名CRUD工程师,最近我朋友突然来问我如何实现延时队列,我脱口而出就是MQ。不过突然想到公司的项目好像用的是java的一个原生类。于是我就想着趁周末的时间好好的去探究一下各方法实现延时队列的优缺点。 延迟消息 延迟消息就是字…...
基于java的circle buffer的实现
总目录链接==>> AutoSAR入门和实战系列总目录 文章目录 缓冲区示例什么是循环缓冲区?方法 1:使用数组插入元素删除元素方法 2:使用链表插入元素:删除元素:当数据经常从一个地方移动到另一个地方或从一个进程移动到另一个进程或被频繁访问时,它不能存储在永久性内存…...
通用方法——为什么重写equals还要重写hashcode
本文介绍java.lang.Object类中的两个方法:equals和hashCode。这两个方法大家应该都知道,但是这两个方法的作用是什么、为什么重写equals还要重写hashCode、它们之间有什么关系和约定等,今天就来带大家了解一下。 1、hashCode hashCode即散列…...

JavaSE学习进阶day2_01 包和权限修饰符
第一章 包 1.1 包 包在操作系统中其实就是一个文件夹。包是用来分门别类的管理技术,不同的技术类放在不同的包下,方便管理和维护。 在IDEA项目中,建包的操作如下: 这个咱们在基础班就谈到过。 包名的命名规范: 路径…...
Android性能调优 - 省电优化
省电:通过工具Battery Historian查看到:耗电大头: 屏幕、网络、cpuled/oled屏幕显示:降低亮度,开深色模式;锁屏间隔缩短到 ;亮屏需要一直持有唤醒锁,还有gps定位也需要用到唤醒锁;网络: 常用的网络优化措施…...
ElasticSearch - SpringBoot整合ES之全文搜索匹配查询 match
文章目录1. 数据准备2. match 匹配查询1. 全文检索2. 简化查询DSL语句3. match 匹配查询原理官方文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/index.html权威指南:https://www.elastic.co/guide/cn/elasticsearch/guide/current/…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...

WebRTC调研
WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...

高抗扰度汽车光耦合器的特性
晶台光电推出的125℃光耦合器系列产品(包括KL357NU、KL3H7U和KL817U),专为高温环境下的汽车应用设计,具备以下核心优势和技术特点: 一、技术特性分析 高温稳定性 采用先进的LED技术和优化的IC设计,确保在…...

高保真组件库:开关
一:制作关状态 拖入一个矩形作为关闭的底色:44 x 22,填充灰色CCCCCC,圆角23,边框宽度0,文本为”关“,右对齐,边距2,2,6,2,文本颜色白色FFFFFF。 拖拽一个椭圆,尺寸18 x 18,边框为0。3. 全选转为动态面板状态1命名为”关“。 二:制作开状态 复制关状态并命名为”开…...