一、TFTP概念

1.1、TFTP:简单文件传送协议

最初用于引导无盘系统,被设计用来传输小文件

特点:
          基于UDP协议实现
          不进行用户有效性认证

数据传输模式:
                        octet:二进制模式(常用)
                        netascii:文本模式
                         mail:已经不再支持

二、TFTP通信过程

2.1、  TFTP通信过程总结

1、服务器在69号端口等待客户端的请求
2、服务器若批准此请求,则使用临时端口与客户端进行通信
3、每个数据包的编号都有变化(从1开始)
4、每个数据包都要得到ACK的确认如果出现超时,则需要重新发送最后的包(数据或
ACK)
5、数据的长度以512Byte传输
6、小于512Byte的数据意味着传输结束

2.2、TFTP协议分析

 2.2.1、分析读写请求

 2.2.2、分析数据包

 2.2.3、分析ACK(应答)

操作码为04,块编号为刚接收的号码:01

   如0401,表示接收成功,并且数据无误

2.2.4、ERROR(数据丢失应答)

  操作码为05,如果接收到数据有误,回复05,即可让服务器在次重新发送。

不同的差错码 ,有不同的信息

0 未定义,参见错误信息
    1 File not found.
    2 Access violation.
    3 Disk full or allocation exceeded.
    4 illegal TFTP operation.
    5 Unknown transfer ID.
    6 File already exists.
    7 No such user.
    8 Unsupported option(s) requested.

三、编写代码流程(客户端)

第一步:创建 套接字——socket函数

第二步:补齐sockaddr_in  信息(发给谁)

第三步;创建一个子函数{   do_download(int sockfdstruct  sockaddr_in  mysockaddr)}

下面的代码都在子函数下创建

第四步:把读写请求设置好写进一个ask_buf数组里,比如:下载huai.txt文件:

sprintf(ask_buf, "%c%c%s%c%s%c", 0, 1, huai.txt, 0, "octet", 0);

第五步:把ask_buf发送给服务器——sendto函数

第六步:接收到 服务器发来的信息(有数据包,有对方的ip,端口号)——recvfrom函数

第七步:拆解数据包(判断是否有数据丢失)

7.1、查看数据包的最前面的操作码,如果是03说明数据没有错误,并且回复04和数据包编号

在这里就可以创建本地一个文件,用来接收到对方发来的数据。但还不能开始写数据进去

7.2、查看数据包的最前面的操作码,如果是05说明数据有错误。需要重新发

第八步:对比数据包编号,(第一次开始接收到数据包编号都是为1,第二次为2,以此类推)

8.1,做判断,如果第一次接收到数据包编号为1,并且数据包的总字节为516,说明数据包顺序没有问题,可以写进本地一个文件里(此判断运用于下载文件大于512个字节的)并回复给服务器,04应答

8.2做判断,如果第一次接收到数据包编号为1,并且数据包的总字节小于516,说明数据包顺序没有问题并且说明此数据包是最后一个,可以写进本地一个文件里,即下载完成。(此判断运用于下载文件小于512个字节的)并回复给服务器,04应答

四、服务器

4.1、事先准备好软件作为服务器 (端口号69)

4.2、案例:下载服务器下的dir文件夹中huai.txt(内容如下)

五、TFTP对案例的使用

#include<stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include<stdlib.h>
#include<string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>#define N 1024void do_download(int sockfd,struct sockaddr_in mysockaddr)
{  socklen_t addrlen=sizeof(mysockaddr);char filename[30];printf("please input do_download filename\n");scanf("%s",filename);char buf[N]="";int flag=0;int num=0;ssize_t byte;int fd;unsigned char ask_buf[50];int ask_buf_text;ask_buf_text= sprintf(ask_buf,"%c%c%s%c%s%c",0,1,filename,0,"octet",0);if(sendto(sockfd,ask_buf,ask_buf_text,0,(struct sockaddr *)&mysockaddr,addrlen)==-1){perror("fail to sendto for ask_buf");exit(1);}while(1){    if((byte=recvfrom(sockfd,buf,N,0,(struct sockaddr*)&mysockaddr,&addrlen))==-1){perror("fail to recvfrom_buf");exit(1);}if(buf[1]==5){perror("recvfrom message fail ");exit(1);}if(buf[1]==3){if(flag==0){if((fd=open(filename,O_RDWR|O_CREAT|O_TRUNC,0664))==-1){perror("fail to open filename");exit(1);}flag=1;}  }if((num+1== ntohs(*(unsigned short*)(buf+2))) &&  (byte==516)){num= ntohs(*(unsigned short*)(buf+2));if(write(fd,buf-4,byte-4)==-1){perror("fail to write");exit(1);}buf[1]=4;if(sendto(sockfd,buf,4,0,(struct sockaddr *)&mysockaddr,addrlen)==-1){perror("retall fail ");exit(1);}}else if((num+1== ntohs(*(unsigned short*)(buf+2))) &&  (byte<516)){if(write(fd,buf-4,byte-4)==-1){perror("fail to write");exit(1);}buf[1]=4;if(sendto(sockfd,buf,4,0,(struct sockaddr *)&mysockaddr,addrlen)==-1){perror("retall fail ");exit(1);}printf("do_download finish\n"); }}}int main(int argc ,char *argv[])
{if(argc < 2){fprintf(stderr, "Usage: %s ip  and port \n", argv[0]);exit(1);}int sockfd;struct sockaddr_in mysockaddr;if((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1){perror("fail to sockfd");exit(1);}mysockaddr.sin_family=AF_INET;mysockaddr.sin_port =htons(69);mysockaddr.sin_addr.s_addr=inet_addr(argv[1]);do_download(sockfd,mysockaddr);return 0;}

运行结果

运行命令:./a.out 10.152.194.124

please input do_download filename
huai.txt
do_download finish

在unbantu下的本地文件,出现了一个huai.txt 文件,内容与服务器的huai.txt一样

下载成功。

UDP编程——TFPT(小文件传输)相关推荐

  1. FTP VS镭速传输,小文件传输技术内有乾坤

    ​ 小文件传输,一般文件传输软件都可以解决的问题.大家最早使用的小文件传输软件,非开源软件FTP莫属了.但对FTP,也有很多企业在与镭速进行技术沟通时,都提及到,它的传输是真的慢! 我们将其与镭速传输 ...

  2. 基于UDP的企业级大文件传输体系

    在信息技术与互联网技术快速发展的今天,很多企业,特别是大中型企业都建设了林林总总的信息系统.这些信息系统助推企业实现了业务的快速发展.办公管理的科学高效,为企业创造了巨大的经济价值.这些信息系统在功能 ...

  3. windows环境下的socket编程(tcp文件传输的实现)

    开发环境 使用codeclock软件进行编程 新建项目选择console application完成相应的步骤即可.在项目下有main.c的文件只需要将代码写入其中即可. 代码设计 客户端 clien ...

  4. 写了一个文件传输软件

    大家好,我是涛哥. 最近遇到这样一件事情,有一个大文件,用微信从电脑A传输到电脑B,结果微信提示文件过大.这点小事情,略微有点郁闷. 解决办法肯定是有的,比如下载一个文件传输软件,然后传送大文件.不过 ...

  5. 加速文件传输协议如何工作?

    流行的文件传输协议(例如FTP / S,SFTP和HTTP / S)取决于名为TCP的基础协议.TCP的问题在于,随着网络条件(例如延迟和数据包丢失)的增加,网络吞吐量会大大降低.这在很大程度上归因于 ...

  6. html大文件传输,socket大文件传输

    遇到了在c#中socket如何实现大文件传输 接收端 private void Receive(Socket socket) { NetworkStream ns = new NetworkStrea ...

  7. windows server 驱动精灵_还在用Windows文件共享?我来教你一键摆脱Windows海量小文件使用和备份的噩梦...

    每当我问到客户,"你用什么存储产品作为文件共享?" 经常听到的一个答案(自豪滴)是,"文件共享需要存储么?我们用Windows就可以做到." Windows就是 ...

  8. Qt多文件传输功能实现及方法概述

    Qt多文件传输功能实现 前言 代码实现概述 客户端代码实现 服务端代码 效果展示 结论 前言 本次设计主要是为了功能上的实现,因此对于ui界面的设计都是怎么简单怎么来的,主要的功能就是实现多个文件的发 ...

  9. fastapi 传输文件存文件_揭秘|国内影视文件传输的真相,跨境文件传输更不简单...

    2020年影视行业至黑时刻总算要过去了,下半年复苏迹象已经显现.作为影视行业的基础搬运工,文件传输贯穿始末.无论是TB级原始素材还是后期协作的大文件,多团队高效协作必然要考虑大文件传输这个基础工具. ...

最新文章

  1. linux发现很多pif和exe文件,u盘里 木马xftiaj.pif 是什么文件,肿么删除?
  2. JSP 三 :九大隐式对象
  3. 机器学习中的数学 人工智能深度学习技术丛书
  4. OpenCvSharp 图像像素归一化
  5. [原创]ExtAspNet秘密花园(十六) — 表格之排序与分页
  6. 超图iClient 3D 入门程序 - 1
  7. 驱动程序实例(四):按键驱动程序(platform + input子系统 + 外部中断方式)
  8. java高校教师工作量管理系统_基于ssh/bs/java/asp.net/php/web/安卓的高校教师工作量管理系统...
  9. 电脑教程从入门到精通_如何自学原画设计|新手如何开始学原画?(附视频教程从入门到精通)...
  10. P3172-[CQOI2015]选数【dp,容斥】
  11. 中小学信息学相关比赛汇总(C++类)
  12. mysql 默认事务隔离级别_详解MySQL事务的四大特性和隔离级别
  13. 新的博客,试试写博客看看
  14. 传智播客 C/C++学习笔记 内存四区模型
  15. android pickerview 多行,Android-PickerView系列之介绍与使用篇(一)
  16. vue根据拼音选择城市better-scroll
  17. java职业教育考试题_云课堂智慧职教java职业证书题库答案
  18. 原型工具Axure常见问题
  19. 土方计算过程(方格网法)
  20. android 闪光灯 频闪,技术丨频闪人像的闪光灯调节和拍摄要点

热门文章

  1. html怎么修改td 的宽度,互联网常识:htmltd怎么设置宽度
  2. js正则匹配手机号、身份证号
  3. jquery 编码解码
  4. 在线URLEncode/URLDecode网址
  5. 文字/文本超出显示省略号
  6. Android初学之------Android Studio 运行java程序
  7. SOA面向服务的架构设计
  8. Numpy之logspace
  9. JAVA通过Hutool解析CSV文件【导入即用,无需封装】
  10. git 删除远端分支