tftp协议概述

tftp(简单文件传输协议)是基于UDP适用于网络上进行文件传输的标准协议。

特点:

应用层协议,基于UDP协议实现。

下载文件功能实现过程
1.服务器在69号端口等待客户端的请求。
2.客户端发送读写请求报文,服务器批准并使用临时接口与客户端进行通信。
3.服务器向客户端发送数据包并在数据包头设置块编码(可在客户端校验次序)。
4.客户端收到数据包后向服务器发送带有操作码和块编码的ACK
5.客户端校验收到的数据是否小于512byte,若小于则停止继续接收信息。

请求代码编写:

客户端的请求代码由2byte的操作码+未知大小的文件名+0(1byte)+数据传输模式+0(1byte)组成本次通过字符串完成请求代码的编写

 //创建读请求包unsigned char buf[516]="";char *ptr = buf;short int * pa =(short int *)ptr;*pa = htons(1);//1为读2为写,并转化成网络字节序char *pb=ptr+2;strcpy(pb,filename);char * pc= pb+strlen(pb);char *pd=pc+1;strcpy(pd,"octet");

收发功能编写

由ACK与数据包的前4byte可见两者的3~4byte都存放块编码,获取ACK只需将从服务器接受到的数据包取前4byte再将操作码改为4即可。

while (1){bzero(buf,sizeof(buf));//接收数据包res = recvfrom(sfd,buf,516,0,(struct sockaddr*)&sin,&addrlen);printf(" %ld ",n);n+=res;if (res<0){ERR_MSG("recvfrom");return -1;}write(fb,buf+4,res-4);buf[1]=4; //将操作码改为4,pg的前四个字节就是ACKif(sendto(sfd,buf,4,0,(struct sockaddr*)&sin,sizeof(sin))<0)//发送ACK包{ERR_MSG("sendto");return -1;}if (res<516){break;}}

总代码

#include <sys/types.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include  <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#define ERR_MSG(msg) do {\fprintf(stderr,"_%d_",__LINE__);\perror(msg);\
}while(0)#define N 512
#define filename "5.png"int main(int argc, const char *argv[])
{if (argc<3){printf("请输入端口号和IP\n");return -1;}int port = atoi(argv[2]);//创建报式套接字int sfd =socket(AF_INET,SOCK_DGRAM,0);if (sfd<0){ERR_MSG("socket");return -1;}printf("create socket success\n");//填充地址信息结构体,真实的地址信息结构体与协议族有关//AF_INEt 详见 man 7 ipstruct sockaddr_in sin;sin.sin_family     =AF_INET;sin.sin_port  =htons(port);//主机字节序转网络字节序的端口号sin.sin_addr.s_addr = inet_addr(argv[1]);//创建读请求包unsigned char buf[516]="";char *ptr = buf;short int * pa =(short int *)ptr;*pa = htons(1);//1为读2为写,并转化成网络字节序char *pb=ptr+2;strcpy(pb,filename);char * pc= pb+strlen(pb);char *pd=pc+1;strcpy(pd,"octet");size_t sz = 2+strlen(pb)+1+strlen("octet")+1; //数据包大小//发送下载请求if(sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("sendto");return -1;}int fb= open("./5.png",O_WRONLY|O_CREAT,0664);//创建一个文件将读取到的数据写入该文件socklen_t addrlen= sizeof(sin);ssize_t res=0;long  int n=0;while (1){bzero(buf,sizeof(buf));//接收数据包res = recvfrom(sfd,buf,516,0,(struct sockaddr*)&sin,&addrlen);printf(" %ld ",n);n+=res;if (res<0){ERR_MSG("recvfrom");return -1;}write(fb,buf+4,res-4);buf[1]=4; //将操作码改为4,pg的前四个字节就是ACKif(sendto(sfd,buf,4,0,(struct sockaddr*)&sin,sizeof(sin))<0)//发送ACK包{ERR_MSG("sendto");return -1;}if (res<516){break;}}close(sfd);close(fb);return 0;
}

测试结果

编译运行后通过eog图片可见图片下载成功。

在服务器中也显示传输完成

搭建简易客户端从tftp服务器中下载文件相关推荐

  1. 客户端,从服务器上下载文件流程

  2. 搭建简易Linux局网服务器

    搭建简易Linux局网服务器 该文章转自 联信软件 作为桌面操作系统,Linux的人机界面可真是不敢恭维,但是,作为网络操作系统,其易用性(对于NOS而言)和高性能恐怕是很难有能出其右的.当然,这并不 ...

  3. Java代码服务器上下载图片_Java如何从服务器中下载图片

    import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net ...

  4. 安卓从服务器中下载pdf文件 然后调用第三方软件WPS Office打开

    安卓从服务器中下载pdf文件 然后调用第三方软件WPS Office打开 前提: 高版本想使用Uri.fromFile() file://的形式 需要在onCreate 或init方法中添加下面代码. ...

  5. .net中下载文件的方法(转)

    .net中下载文件的方法 一.//TransmitFile实现下载      protected void Button1_Click(object sender, EventArgs e)      ...

  6. tftp 查看服务器文件,如何从命令提示符列出Windows tftp服务器目录和文件?

    搜索热词 我已在 Windows 7中安装了Tftpd32软件.我在我的Windows PC上运行tftp服务器和tftp主目录有几个目录和文件.我必须从Windows命令提示符显示tftp服务器目录 ...

  7. 服务器文件权限在哪里,服务器中的文件权限设置在哪里

    服务器中的文件权限设置在哪里 内容精选 换一换 对象存储服务OBS是华为云提供的稳定.安全.高效.易用的云存储服务,具备标准Restful API接口,可存储任意数量和形式的非结构化数据.弹性文件服务 ...

  8. ftp服务器中更改文件路径,ftp服务器中更改文件路径

    ftp服务器中更改文件路径 内容精选 换一换 文件作用:可以关闭/打开监听端口.指定监听端口.指定监听IP等.文件路径:在运行环境上,在~/ide_daemon目录下查看ide_daemon.cfg配 ...

  9. 新建一个文件夹服务器,云服务器中新建文件夹命令

    云服务器中新建文件夹命令 内容精选 换一换 部署提供可视化.一键式部署服务,支持并行部署和流水线无缝集成,实现部署环境标准化和部署过程自动化.本节通过以下五步介绍如何使用部署服务将项目代码部署到云主机 ...

  10. 服务器新建文件命令,云服务器中新建文件夹命令

    云服务器中新建文件夹命令 内容精选 换一换 使用mount命令挂载文件系统到云服务器,云服务器提示access denied,挂载失败.原因1:文件系统已被删除.原因2:执行挂载命令的云服务器和被挂载 ...

最新文章

  1. 各种协议中的协议类型对应的值
  2. python中的所有功能_python – 是否可以列出模块中的所有功能?
  3. Java内置数据类型
  4. ResNet 运行在Cifar10 测试集86.38% Tensorflow 2.1 小白从代码实践中 理解
  5. vue 项目中 自定义过滤器 全局使用 filter
  6. [转载] python日期时间使用详解和定时器使用讲解
  7. vim复制,粘贴,删除,撤销,替换,光标移动等用法
  8. 为什么建议每个开发人员都需要学Python?
  9. 各种调试接口(SWD、JTAG、Jlink、Ulink、STlink)的区别
  10. 2010提升你幽默感的经典短句
  11. 8个有用的表单构建工具,你一定要使用并收藏好
  12. 达梦出席湖北银行业金融机构信息科技风险管理研讨会
  13. 训练集、验证集、测试集以及交叉验证
  14. OCR技术(大批量生成文字训练集)
  15. 程序员如何打造薪资15k
  16. 加州伯克利计算机科学录取,加州大学伯克利分校录取数据分析
  17. 计算机应用会外审几次呀,sci论文一般会送几个外审
  18. flask template中使用Vue,遇到引入element-ui无效问题,Unknown custom element did you register the component correc
  19. 敬业签苹果ios手机便签APP文本中英文翻译功能如何使用?
  20. C++ 结构体转json

热门文章

  1. 2022腾讯实习生移动客户端开发一面(IEG)
  2. oracle数据透明加密,oracle数据透明加密-TDE
  3. 光栅图形学(一)——直线段的扫描转换算法
  4. 在ADF应用中,能够通过 oracle.adf.view.rich.security.FRAME_BUSTING 参数来使用framebusting功能。
  5. flv网页播放器开源代码
  6. bert获取词向量做textcnn文本分类
  7. Win1903下,如何简单的附加dnf
  8. 【读书】格鲁夫给经理人的第一课-管理杠杆率
  9. 鸿蒙系统 微内核 sel4,引入成熟的微内核技术改良reactos,如sel4
  10. 平均增长率不用计算机,【程阳解答】如何用计算器或Excel计算年均增长率?