UDP编程——TFPT(小文件传输)
一、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 sockfd,struct 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(小文件传输)相关推荐
- FTP VS镭速传输,小文件传输技术内有乾坤
小文件传输,一般文件传输软件都可以解决的问题.大家最早使用的小文件传输软件,非开源软件FTP莫属了.但对FTP,也有很多企业在与镭速进行技术沟通时,都提及到,它的传输是真的慢! 我们将其与镭速传输 ...
- 基于UDP的企业级大文件传输体系
在信息技术与互联网技术快速发展的今天,很多企业,特别是大中型企业都建设了林林总总的信息系统.这些信息系统助推企业实现了业务的快速发展.办公管理的科学高效,为企业创造了巨大的经济价值.这些信息系统在功能 ...
- windows环境下的socket编程(tcp文件传输的实现)
开发环境 使用codeclock软件进行编程 新建项目选择console application完成相应的步骤即可.在项目下有main.c的文件只需要将代码写入其中即可. 代码设计 客户端 clien ...
- 写了一个文件传输软件
大家好,我是涛哥. 最近遇到这样一件事情,有一个大文件,用微信从电脑A传输到电脑B,结果微信提示文件过大.这点小事情,略微有点郁闷. 解决办法肯定是有的,比如下载一个文件传输软件,然后传送大文件.不过 ...
- 加速文件传输协议如何工作?
流行的文件传输协议(例如FTP / S,SFTP和HTTP / S)取决于名为TCP的基础协议.TCP的问题在于,随着网络条件(例如延迟和数据包丢失)的增加,网络吞吐量会大大降低.这在很大程度上归因于 ...
- html大文件传输,socket大文件传输
遇到了在c#中socket如何实现大文件传输 接收端 private void Receive(Socket socket) { NetworkStream ns = new NetworkStrea ...
- windows server 驱动精灵_还在用Windows文件共享?我来教你一键摆脱Windows海量小文件使用和备份的噩梦...
每当我问到客户,"你用什么存储产品作为文件共享?" 经常听到的一个答案(自豪滴)是,"文件共享需要存储么?我们用Windows就可以做到." Windows就是 ...
- Qt多文件传输功能实现及方法概述
Qt多文件传输功能实现 前言 代码实现概述 客户端代码实现 服务端代码 效果展示 结论 前言 本次设计主要是为了功能上的实现,因此对于ui界面的设计都是怎么简单怎么来的,主要的功能就是实现多个文件的发 ...
- fastapi 传输文件存文件_揭秘|国内影视文件传输的真相,跨境文件传输更不简单...
2020年影视行业至黑时刻总算要过去了,下半年复苏迹象已经显现.作为影视行业的基础搬运工,文件传输贯穿始末.无论是TB级原始素材还是后期协作的大文件,多团队高效协作必然要考虑大文件传输这个基础工具. ...
最新文章
- linux发现很多pif和exe文件,u盘里 木马xftiaj.pif 是什么文件,肿么删除?
- JSP 三 :九大隐式对象
- 机器学习中的数学 人工智能深度学习技术丛书
- OpenCvSharp 图像像素归一化
- [原创]ExtAspNet秘密花园(十六) — 表格之排序与分页
- 超图iClient 3D 入门程序 - 1
- 驱动程序实例(四):按键驱动程序(platform + input子系统 + 外部中断方式)
- java高校教师工作量管理系统_基于ssh/bs/java/asp.net/php/web/安卓的高校教师工作量管理系统...
- 电脑教程从入门到精通_如何自学原画设计|新手如何开始学原画?(附视频教程从入门到精通)...
- P3172-[CQOI2015]选数【dp,容斥】
- 中小学信息学相关比赛汇总(C++类)
- mysql 默认事务隔离级别_详解MySQL事务的四大特性和隔离级别
- 新的博客,试试写博客看看
- 传智播客 C/C++学习笔记 内存四区模型
- android pickerview 多行,Android-PickerView系列之介绍与使用篇(一)
- vue根据拼音选择城市better-scroll
- java职业教育考试题_云课堂智慧职教java职业证书题库答案
- 原型工具Axure常见问题
- 土方计算过程(方格网法)
- android 闪光灯 频闪,技术丨频闪人像的闪光灯调节和拍摄要点