Linux——Linux系统编程之基于TFTP实现服务器与开发板间的文件传输实战总结

目录

0 引言

1 TFTP服务器搭建

1.1 TFTP基础

1.2 Ubuntu搭建TFTP服务器

1.3 测试TFTP服务器

2 开发板实现TFTP文件传输

2.1 同一网段

2.2 配置

2.3 客户端与服务器的通信


0 引言

我们前面总结的Linux字符设备、串口编程博文中,在虚拟机中编译得到可执行文件后,都是通过U盘连接开发板进行测试验证的,或者就是把可执行文件编译到最小系统中,再OTG烧写进开发板,这两种方法都比较麻烦,这里我们就提供一种简单方法,TFTP文件传输,PC机和开发板之间连接一根xx线即可

1 TFTP服务器搭建

要实现服务器与开发板之间的TFTP文件传输,首先要在PC机虚拟机中搭建个Ubuntu服务器,开发板作为客户端。

1.1 TFTP基础

TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务,端口号为69。它基于UDP协议,专门为小文件传输设计,只能从服务器上获取文件,或者向服务器写入文件,不能列出目录,也不能进行认证。

优点缺点

1)用于UDP环境,比如当需要将程序或者文件同时向许多机器下载时就往往需要使用到TFTP协议;

2)TFTP代码所占的内存较小,非常适用于简单的Linux嵌入式设备,这些设备不需要硬盘,只需要固化了TFTP、UDP和IP的小容量只读存储器即可;

3)不需要验证客户端的权限,在局域网中调试设备时传输文件就减少了很多步骤。

TFTP是一个传输文件的简单协议,此协议设计的时候是进行小文件传输的。因此它不具备通常的FTP的许多功能,它只能从文件服务器上获得或写入文件,不能列出目录。

1.2 Ubuntu搭建TFTP服务器

1)安装xinted:apt-get install xinetd

Xinetd即extended internet daemon,是新一代的网络守护进程服务程序,又叫超级Internet服务器,常用来管理多种轻量级Internet服务。Xinetd提供类似于inetd+tcp_wrapper的功能,但是更加强大和安全。原则上任何系统服务都可以使用xinetd,然而最适合的应该是那些常用的网络服务,并且这个服务的请求数目和频繁程度不会太高。像DNS和Apache就不适合采用这种方式,而像FTP、Telnet、SSH等就适合使用xinetd模式。

2)安装tftp和tftpd:apt-get install tftp tftpd

3)建立TFTP配置文件:sudo gedit /etc/xinetd.d/tftp,内容如下:

service tftp
{
		socket_type = dgram
		protocol 			= udp
		wait 				= yes
		user 				= root
		server 		= /usr/sbin/in.tftpd
		server_args = -s /var/tftpboot/
		disable 	= no
		per_source	= 11
		cps 				= 100 2
		flags 				= IPv4
}

4)建立TFTP服务器的目录,并设置访问权限:mkdir /var/tftpboot、chmod 777 /var/tftpboot

5)重启xinetd服务:sudo /etc/init.d/xinetd restart

1.3 测试TFTP服务器

在/var/tftpboot目录下建立个test测试文件,输入内容hello:

新开启一个终端,连接本机tftp服务器,获取test文件到当前目录下:

以上测试OK,搭建TFTP服务器成功。

2 开发板实现TFTP文件传输

2.1 同一网段

局域网中经常会出现“同一网段”这个概念,如果没有计算机基础,一般都会很蒙,所谓的同一网段,就是IP和子网掩码做与运算,结果相同就表示在同一网段,既可以进行局域网的通信。

虚拟机Linux系统查看IP:ifconfig

开发板最小系统查看IP:cat /etc/eth0-settings

由以上可知,两个IP不在同一个网段,所以要想进行通信,就需要进行配置。

2.2 配置

这里我们需要修改下开发板的默认IP,原来是192.168.1.230,但是修改成多少呢?既然是IP和和子网掩码255.255.255.0做与运算,只要IP的前三位一致就可以在一个网段了,具体最后一位怎么设置,我们要查看路由器LAN口设置的IP范围,一般路由器的地址都是192.168.0.1,网页中输入即可查看自己的路由器了。如下仅举例,说明可以设置的IP范围:

然后,通过超级终端修改开发板的IP即可,在/etc/eth0-setting中修改。

2.3 客户端与服务器的通信

开发板制作的 linux最小文件系统支持 TFTP 客户端命令,编译 Busybox 时默认是支持该命令的,设置完开发板IP后,测试与服务器的连接情况,首先网线连接开发板的网口到路由器上,然后输入命令:ping 服务器IP

下图是截图的演示案例图,出差中,板子不在手边,所以不能亲自演示截图分享了:)

以上,说明开发板和TFTP服务器间通信OK的,获取TFTP文件到开发板当前目录下的命令:tftp -g -l 文件名 -r 文件名 服务器IP

作于202012172155,已归档

———————————————————————————————————

本文为博主原创文章,转载请注明出处!

若本文对您有帮助,轻抬您发财的小手,关注/评论/点赞/收藏,就是对我最大的支持!

祝君升职加薪,鹏程万里!

Winter_world CSDN认证博客专家 嵌入式开发 Android JavaWeb
一个只喜欢带干货,不为吸引眼球而弄些花哨软文的博主;
一个秉承活到老学到老精神的双985高校毕业研究僧;
一个曾就职于华为公司,敢于拼搏、项目经验丰富的工程师;
一个从硬件、嵌入式、互联网多路径全面开花的全栈达人;
点击下方关注,博主将增加无限动力分享更多干货,愿与您相伴,不负韶华,奔向更好的明天!

热门文章

暂无图片
编程学习 ·

Python/PTA--第2章 分段计算居民水费 (10分)

第2章-13 分段计算居民水费 (10分) 为鼓励居民节约用水,自来水公司采取按用水量阶梯式计价的办法,居民应交水费y(元)与月用水量x(吨)相关:当x不超过15吨时,y4x/3;超过后…
暂无图片
编程学习 ·

那些貌似真诚的人

是不是经常遇到这种人,大家的评价都是他很真诚,人也很简单,事情好,事情往往会有利于他,而且他过的很快乐。 残酷的现实是没有简单的快乐,只要是丰富的快乐,他就不会简单。一个人貌似真诚不见得…
暂无图片
编程学习 ·

JetBrains软件怎么设置中文?值得一看!

JetBrains是一家捷克的软件开发公司,此公司最为人所熟知的产品是Java编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA。jetbrains全家桶基本都是英文的,有的朋友使用起来很不方便,那么jetbrains全家桶怎么汉化呢?…
暂无图片
编程学习 ·

ElasticSearch应用篇-搜索增强

ES有一些非常强大的能力,例如:根据用户搜索的时候,也可以搜索同义词,也可以基于语义进行分词,返回最最适合的结果,ElasticSearch是如何实现这种能力的呢? 一、ES搜索与Analyzer 1.ES搜索过程 …
暂无图片
编程学习 ·

框架的诞生-零:为什么写框架?

框架的诞生-零:为什么写框架?题外话什么是框架?框架解决什么问题?为什么写框架?为了造一个更好更适合的轮子为了学习和实践总结一些游戏客户端框架参考心里话框架开发系列文章最后题外话 大家好,很高兴&am…
暂无图片
编程学习 ·

7、外观模式

外观模式 文章目录外观模式概述结构结构实现练习源代码抽象外观类案例外观模式优/缺点与适用环境优点缺点适用环境概述 外观模式:为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 外观模式…
暂无图片
编程学习 ·

动态规划之股票问题123

问题描述: 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 来源&a…
暂无图片
编程学习 ·

北邮CSAPP第三章之数据格式与程序编码

程序的机器级表示 本章学习内容:汇编代码 高级语言屏蔽了程序的机器级实现。 用高级语言编写的程序可以在不同的机器上运行,汇编代码则于特定机器密切相关 学习汇编代码能理解编译器优化能力,并分析代码中隐含的低效率 此外,高…
暂无图片
编程学习 ·

安装gradle

安装gradle1、下载二进制包解压2、配置环境变量3、验证,如下成功4、配置Gradle仓库源5、idea配置1、下载二进制包解压 2、配置环境变量 3、验证,如下成功 4、配置Gradle仓库源 在Gradle安装目录下的 init.d 文件夹下,新建一个 init.gradle …
暂无图片
编程学习 ·

CodeGen标记循环

CodeGen标记循环 标记循环是一个模板文件构造&#xff0c;它允许您迭代CodeGen拥有的标记信息的集合。为了使用标记循环&#xff0c;必须基于至少定义了一个字段标记的存储库结构生成代码。 标记循环由一对匹配的<Tag_LOOP>和</Tag_LOOP>标记分隔&#xff0c;它们围…
暂无图片
编程学习 ·

CodeGen按钮循环

CodeGen按钮循环 按钮循环是一个模板文件构造&#xff0c;它允许您迭代CodeGen拥有的按钮信息集合。 在按钮循环中处理的按钮的定义可以来自两个位置之一。 如果基于UI工具箱输入窗口定义进行处理&#xff0c;则默认情况下&#xff0c;按钮集合由该输入窗口定义中的按钮确定。否…
暂无图片
编程学习 ·

CodeGen准备存储库

CodeGen准备存储库 CodeGen几乎总是与提供用于生成源文件的元数据的存储库结构一起使用&#xff0c;并且许多令牌需要使用存储库结构。 基本要求是有一个结构定义&#xff0c;并且该结构定义包含一个或多个字段定义。有些标记还要求定义键&#xff0c;有些则需要具有结构赋值的…
暂无图片
编程学习 ·

2020年PMP笔记归纳第六章项目进度管理

学习目标&#xff1a; 掌握第六章项目进度管理 学习内容&#xff1a; 内容章节 6.1 规划进度管理 6.2 定义活动 6.3 排列活动顺序 6.4 估算活动持续时间 6.5 制定进度计划 6.6 控制进度 第六章PMBOK概述中的重点内容 具有未完成项的迭代型进度计划。基于适应型生命周期的滚动…
暂无图片
编程学习 ·

无人机项目跟踪记录--失败

查看了源代码&#xff0c;发现无法往下进行了&#xff0c;原因如下&#xff1a; 1、这个第二代机移植了cleanfly开源的源码程序&#xff0c;似乎这个开发板的目的是为了学习cleanfly源码的&#xff0c;而不是为了初步了解无人机的&#xff0c;已经是个很高阶段了&#xff0c;超…
暂无图片
编程学习 ·

Python3正则表达式之:(?(id/name)yes-pattern|no-

Python3正则表达式之&#xff1a;(?(id/name)yes-pattern|no-pattern)条件性匹配 1. 用途 (?(id/name)yes-pattern|no-pattern)的作用是&#xff1a; 对于给出的id或者name&#xff0c;先尝试去匹配 yes-pattern部分的内容&#xff1b; 如果id或name条件不满足&#xff0…
暂无图片
编程学习 ·

socket简单使用(Android、c、QT不同场景下使用)

一&#xff1a;Socket使用场景&#xff1a; socket做网络通信使用&#xff0c;例如游戏中的聊天&#xff0c;IM聊天&#xff08;QQ微信等社交&#xff09;&#xff0c;这些是大型的场景&#xff1b;还有一些是次一等的场景&#xff0c;例如一套本地使用的软件&#xff0c;需要…
暂无图片
编程学习 ·

网络信号与数制转换

文章目录信号与传输介质信号双绞线双绞线的连接规范光纤概述光纤的分类光纤接口无线传输介质无线电波微波天线计算机的数质信号与传输介质 信号 什么是信号&#xff1a;信息&#xff0c;数据&#xff0c;信号 信号的分类&#xff1a;①模拟信号②数字信号 模拟与数字的区别&a…
暂无图片
编程学习 ·

樊昌信版通信原理期末复习第一章绪论

第1章 绪论 一、知识点梳理 1、通信的目的&#xff1a;传递消息中所包含的信息。 2、消息&#xff1a;是物质或精神状态的一种反映。 3、信息&#xff1a;是消息中包含的有效内容。 4、通信系统的一般模型 信源输入变换器&#xff1a;将非电物理量变成电信号。 发送设备&…