FTP,TFTP网络数据流文件还原及异步存储设计

深入探索FTP客户端开发:多线程、文件管理与C++/MFC实现 本文还有配套的精品资源,点击获取 简介:本文深入探讨了FTP客户端的关键特性,包括多线程技术以提高文件传输效率、文件和文件夹操作、用户管理和多客户端登录功能。我们将重点介绍使用C++和MFC库开发FTP客户端的实践,以及如何处理并发操作和用户界面设计。此外,还会涉及到理解与服务器交互的FTP协议和通信细节。 1. FTP客户端的核心特性 1.1 FTP客户端... 阅读详情


一、背景

现需要通过抓取的FTP, tftp网络数据包,进行分析(解析),并拿到里面对应的上传下载文件,将文件还原到本地,同时要考虑高并发(上万条网络流同时进行)的情况。

 

二、分析FTP, TFTP数据

首先要想还原文件,必须要知道以下几个条件:对应的传输文件流的TCP流信息(srcip,srcport, dstip, dstport),上传还是下载的文件名,主被动模式,传输方式。

1、FTP

详细的ftp协议解析,这里不谈(网上多的是),这里只说重要的地方。

 

FTP分信号流和文件流,信号流可以根据端口21确定,且21端口的一端为服务器,找到信号流。

(1) 如果收到“PORT”命令,那么就是主动模式,此时记录client的ip, port结合serverip和端口20得到传输文件流的TCP流信息,如果收到“PASV”(或者“EPSV”rfc2428, “LPSV”rfc1639),那么可以确定为被动模式,那么server会response 对应的ip,port,结合client的ip,(这里还拿不到client的文件流port, 这个port会主动连接server的ip, port)得到传输文件流的TCP流信息。

(2) 接下来,如果收到“RETR”命令,说明是要下载文件,如果收到“STOR”命令,就是上传文件,解析命令后面的数据得到文件名。

(3)传输方式,根据命令“TYPE”来判断。 (我个人的做法是,如果是 “A”, 那么就是文本的方式写文件fopen(filename, “w”), 如果是其他,那么就是二进制的方式写文件fopen(filename, “wb”));

(4) 文件结束。收到server端发送的226命令表示文件结束,或者过程中其他的错误码(写好日志)结束写文件操作。

 

那么根据上面的信息,找到TCP文件流,解析出payloadfwrite进文件就可以了。

这里要注意,信号流与文件流的协同问题,以及文件流端口复用问题。

2、TFTP

         TFTP非常简单,就两种模式RRQ,WRQ,server使用端口69,传输使用UDP。

这个过程client 的ip port都不会变,而server发信令的端口使用69,文件流端口是不一样的。

(1)      RRQ

如上图,通过命令解析,opcode = 1 表示RRQ (读请求,就是下载),得到文件名 rfc1350.txt,以及文件传输方式octet, 马上下一个数据包,就是server给client发的文件数据包(此时也知道了server段的文件流port),之后是client的ack, server要收到了client的ack后才会继续发下一个data packet。 

(2)      WRQ

如上图,解析命令 opcode = 2表示WRQ (写请求,就是上传), 得到文件名和传输方式,马上server会发一个ack过来,此时知道了server段的文件流port,接下来就是文件传输了,同上面的RRQ.

 

文件结束标志:每个文件数据包是定长的(512Byte),如果收到一个数据包payload小于512,那么说明文件结束了

 

 

 

三、异步存储文件设计(解决高并发)

         根据上面的描述已经可以得到了文件流,可以直接创建文件,写文件了。但是如果拿到一个数据包就写一个数据包到文件中,会有三个问题, 第一:效率较低。因为写磁盘的速度比较慢,所以会影响整个的效率。第二:产生很多的文件碎片(因为间隔的写小文件块,会被存到磁盘的各个地方,这个具体的请查看相应文档)。第三:因为是持续写,一个文件流就要对应一个文件句柄(如果不对应一个文件句柄,而且每次都fopen, fclose,那么效率实在是太低了),在win6 64位电脑上一个进程能同时打开的文件句柄数为500个左右(我自己测试的是510个),怎么处理同时上万条文件流的写问题。

         所以,根据上面的问题情况,下面给出异步写文件的解决方案。

        

         定义

StructDATA_BLOCK   // 文件内容块

{

         Int nPos;                     // 在buffer内的偏移量

         Int nDatalen;

}

FILE_BUFFER_INTO  // 文件缓存buffer

{

         Char* pBuffer;                   // buffer 内存

         Int nTotalLen;           //buffer 总长度

         Int nCurrentPos;      // buffer当前使用位置

         Map<int,vector<DATA_BLOCK>> mapFIleTaskData;  // key: 文件任务句柄

}

StructFILE_TASK_INFO

{

         Int nTaskHandle;

         String sFileName;

         FILE_MODE fm;   // 这个是fopen的第二个参数 “w”或者“wb”

}

 

定义成员:

         List<FILE_BUFFER_INFO*>m_listFileWriteBuffer;   // 用于写入的buffer

         List<FILE_BUFFER_INTO*>m_listFileReadBuffer;// 用于读取buffer数据写文件

         Map<int, FILE_TASK_INFO>m_mapFIleTaskInfo; // 存储文件任务

 

从上面的定义其实可以看出基本思路了,  申请批量(我个人是申请了10个2M大小的buffer)的FILE_BUUFER_INFO用于缓存文件流数据,存入m_listFileWriteBuffer中,收到文件流数据块的时候,写入pBuffer中,并且记录好是哪个文件的(记录在mapFIleTaskData中),当第一个FILE_BUFFER_INFO的buffer块写满了(或定时器到了,见说明1),那么就把这个bufferpush到m_listFileReadBuffer中去,同时继续写第二个buffer块,于此同时,读线程会从m_listFileReadBuffer中读取buffer,将里面的数据(根据mapFIleTaskData的记录)读出来,写入文件(见说明2),读完了一个buffer,那么立刻将此buffer又重新push到m_listFileWriteBuffer中使用,就这样交替异步的缓存机制处理。

这里有几点说明:

         第一:m_listFileWriteBuffer的pop条件。当front的buffer满了,肯定要弹出,同时如果定时器时间到了,也要弹出。这里使用定时器的原因是,处理最后数据不能让buffer满,而不能让读线程读到文件最后的数据。

         第二:写文件,这里我个人也是开辟了一个写文件缓存,4k大小,因为读线程是每次会把某个文件(任务句柄)在一个buffer中的所有数据都出来,所以我把读到的数据都缓存到4k的缓存里面,当满了,或者结束的时候才调用fwrite,这样效率会更高。

         第三:文件句柄,因为整个过程都使用的是任务句柄,文件句柄(fopen产生)只有一个,那就是在读buffer写文件线程里面,一次把buffer里面的同一个文件数据全部读出来写入文件,写完了,就fclose,再fopen下一个  (详  请分析mapFIleTaskDatakey为文件任务句柄)。

         第四:文件结束,因为是异步的,当收到的文件结束命令的时候,未必它对应的文件数据块都写到了文件中,如果此时再遍历所有buffer,把这个文件数据都写入文件,再close,效率太低了。其实很简单,当文件结束的时候就不用发什么停止命令了,直接写一个DATA_BLOCK nDatalen = 0就可以了,那么读线程读到这个block的时候自然就知道文件结束了。

 

下面没了。

                                                                                                                                           

 

                                                                                                                         Author: min

基于winpcap的多线程ftp文件还原系统的实现 基于winpcap的多线程ftp文件还原系统的实现,如何实现ftp文件的捕获以及还原,并且应用到多线程。 立即下载

相关推荐

四旋翼无人机控制算法实战:从PID到MPC的路径跟踪

本文深入探讨了四旋翼无人机控制算法的演进路径,从基础的PID控制到高级的MPC算法,详细解析了各类算法的原理、实现技巧及适用场景。通过实战案例对比分析,为开发者提供从算法选型到参数调优的全方位指导,助力提升无人机飞行控制的精度与稳定性。

weixin_29090917的博客 240

aiohttp 异步http请求-5.下载大文件边下载边保存(节省内存)

前言 当从网络上下载小文件时,比如一张图片,可以直接用response.read() 来读取返回的数据流文件。 但是当下载一个几百兆,几千兆的文件会占用很大的内存,为了减少内存的占用可以一边读取一边下载的方式。 流式响应内容 平常返回的response 对象,使用read(), json()和且text()非常方便,但是需谨慎使用它们。所有这些方法都将整个响应加载到内存中。 例如,如果您要下载几个千兆字节大小的文件,这些方法将加载内存中的所有数据。相反,您可以使用该content 属性。它是aiohttp.

qq_27371025的博客 4812

YOLOV8主干改进方法:C2f-Dual——DualConv轻量化双卷积设计(附改进代码)

DualConv是一种创新的卷积网络结构,旨在构建轻量级的深度神经网络。它通过结合3×3和1×1的卷积核处理相同的输入特征映射通道,优化了信息处理和特征提取。DualConv利用组卷积技术高效排列卷积滤波器,大大降低了计算成本和参数数量。

m0_74890428的博客 4698

FTP数据还原

FTP数据还原部分:利用WireShark打开实验实验数据data.pcapng。 1 FTP服务器的IP地址是多少?你是如何发现其为FTP服务器的? 2客户端登录FTP服务器的账号和密码分别是什么? 3 客户端从FTP下载或查看了2个文件,一个为ZIP文件,一个为TXT文件,文件名分别是什么? 4 还原ZIP文件并打开(ZIP有解压密码,试图破解,提示:密码全为数字,并为6位)。截图破解过程。 5 TXT文件的内容是什么?

zzzfff__的博客 1461

AUTOSAR实战:手把手教你配置EthTsync模块,搞定车载以太网时间同步

本文详细解析AUTOSAR架构中EthTsync模块的配置方法,实现车载以太网时间同步。通过对比gPTP与PTP协议差异,提供从开发环境准备到参数配置、模块集成的全流程指南,并分享性能优化与调试技巧,帮助开发者实现微秒级同步精度,满足自动驾驶等高精度时间同步需求。

weixin_28736335的博客 372

从零构建锂电池主动均衡系统:Simulink仿真中的Buck-Boost拓扑实战指南

本文详细介绍了如何在Simulink中从零构建基于Buck-Boost拓扑的锂电池主动均衡系统。通过仿真环境搭建、参数优化、控制策略设计和性能评估,为工程师提供了完整的实战指南,帮助快速验证和优化均衡算法,提升电池组一致性与寿命。

gitlab7runner的博客 896

批处理之FTP自动同步文件

1. FTP.exe工具 ftp.exe是Windows系统提供的一个FTP客户端命令行工具。通过ftp.exe可以完成登录,显示远程文件、下载、上传、重命名、删除远程文件等操作。 1.1. 命令参数 FTP [-v] [-d] [-i] [-n] [-g] [-s:filename] [-a] [-A] [-x:sendbuffer] [-r:recvbuffer] [-b:asyncbuffers] [-w:windowsize] [host] -v 禁止显示远程服务器响

飞鹤的程序员人生 5277

从Android到鸿蒙:UI框架迁移的实战指南与最佳实践

本文为Android开发者提供了将应用UI框架迁移至鸿蒙系统的实战指南。文章深入对比了Android命令式编程与鸿蒙ArkUI声明式编程的核心差异,详细讲解了从环境配置、布局迁移(如RecyclerView转List)、逻辑处理到多设备适配与性能优化的全流程最佳实践,帮助开发者高效完成迁移工作。

weixin_29208077的博客 433

tftp协议给服务器上传数据,TFTP连接过程详解

概述TFTP,全称是 Trivial File Transfer Protocol(简单文件传输协议),基于 UDP实现,该协议简单到只能从远程服务器读取数据或向远程服务器上传数据。TFTP有三种模式:netascii,这是8位的ASCII码形式;另一种是octet,这是8位源数据类型;最后一种 mail已经不再支持,它将返回的数据直接返回给用户而不是保存为文件。虽然 TFTP 不具备通常的 FT...

weixin_39559804的博客 2303

告别卡顿!用LVGL+DMA刷新STM32F407的SPI屏幕,性能提升实战

本文详细介绍了如何通过LVGL+DMA技术优化STM32F407驱动SPI屏幕的性能,实现接近60FPS的流畅刷新。从硬件瓶颈分析到SPI与DMA的精细化配置,再到LVGL的双缓冲机制与局部刷新优化,提供了一套完整的性能提升方案。特别适合嵌入式GUI开发中面临卡顿问题的工程师参考。

weixin_42531588的博客 378

如何通过conda安装HyPhy教程

本文介绍了在Ubuntu系统上通过conda安装分子进化分析工具HyPhy的详细步骤。首先创建conda环境并指定Python 3.8版本,然后通过bioconda通道安装HyPhy软件包。安装完成后可通过conda list命令验证安装。文中还特别指出可能遇到的libcrypto.so.1.1共享库缺失错误,并提供了解决方案的参考链接。该教程配有安装过程截图,帮助用户直观了解操作流程和验证安装结果。

猿小白的博客 8259

FTP数据还原部分

1.FTP服务器的IP地址是多少?你是如何发现其为FTP服务器的? 用ftp作为条件过滤,发现大量基于FTP协议传输的数据包,所以推测是有FTP服务器的。 因为服务器会响应用户的请求,所以用 ‘response’ 过滤 我们可以发现,response的ip原地址都是192.168.182.1,所以ftp的ip地址是192.168.182.1 2.客户端登录FTP服务器的账号和密码分别是什么? 由于账号和密码指定是用户发送给ftp服务器的,于是我们可以用: ftp && ip.src ==

m1287578441的博客 800

生成EtherCAT从站XML图片信息方法

详细介绍了EtherCAT从站XML文件中图片元素的生成方法。

kevin1499的博客 2128

wireshark 包 分析 之 ftp 协议 还原 问题

1、  Understanding [TCP ACKed unseen segment] [TCP Previous segment not captured]

梦想专栏 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

FTP访问以及通过后缀读取文件解析

MacRun的博客 949

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

TFTP简单传输协议了解

TFTP简介

Daxian的博客 9168

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

计网必会:FTP 文件传输协议

FTP的客户端首先服务器端口和服务器之间发起一个用于控制的TCP连接,FTP的客户端也通过该连接发送用户标识和口令,。当ftp服务器端从该连接上收到一个文件传输的命令后,发起一个到客户端的TCP数据连接,FTP在该数据连接上准确地传送文件,然后关闭连接,而当控制流空闲很长时间后,客户端的防火墙会将其会话置为超时,这样当大量数据通过防火墙时,会产生一些问题。用户登录本地主机向远程主机传输一个文件,为了让用户能够访问远程主机的账户,用户必须提供一个标识,类似于之前文章中的用户标识,满足唯一性。

m0_58381606的博客 1532

ftp数据流分析

1. 简介 项目中有一个在stm32中移植ftp的功能,在网上找到了一个开源的 lwip_ftpd_master 的代码,文件系统是fatfs。 ftp使用的是tcp协议,通过21端口建立连接,客户端通过这个端口发送命令给服务器,服务器根据发送来的命令进行相应的操作。 ftp涉及到两种模式,一种是主动模式(PORT命令)、一种是被动模式(PASV命令)。 2. 具体(passive模式) 1. ...

老鹏 2016

TFTP:简单文本传输协议的数据包格式解析以及文件读取代码实现

本节我们看看TFTP数据包的组装方式,为我们代码实现该协议奠定基础。TFTP协议总共有5中不同数据包,分别对应读请求,写请求,数据块,接收回应(ACK),以及错误。前两种数据包格式一样,只不过某些值域设置有差别,剩下的三种数据包格式各不相同。但无论哪一种数据包,他们都包含一个值域叫操作码,用来定义该数据包属于那种类型。 我们先看读请求和写请求数据包的格式,首先是2字节表示操作码,它用来表示当前数据...

tyler_download的专栏 3200

tftp客户端实现(二)-写文件并回发确认消息

一、使用fopen来创建文件当tftp的RRQ消息发送成功后,正常情况下服务器端就会回发第一个Data数据包,这时,客户端需要做的是,在本地新建一个文件,以便将从服务器端接收的数据写入到此文件中。现在,我们暂时使用fopen来创建文件。对于fopen()函数,简单介绍一下:函数原型:FILE * fopen(const char * path,const char * mode);返回值:文件顺利打

5061

tftp升级实现说明(一)

一、前言说明  tftp(Trivial File Transfer Protocol,文件传输协议),是tcp/ip簇中用于客户端和服务端之间进行简单文件交互传输的协议。  下面就tftp的几个知识点进行列举说明: 1、 tftp协议的端口号定为69; 2、只支持从服务器上获得或写入文件,不能列出目录,也不能进行认证; 3、传输时以8位数据为最小单位,每个包定长512个字节,如果不足512字...

lisayh的博客 2478

TFTP通信原理

TFTP的通信流程 TFTP共定义了五种类型的包格式,格式的区分由包数据前两个字节的Opcode字段区分,分别是: ·l读文件请求包:Readrequest,简写为RRQ,对应Opcode字段值为1 ·l写文件请求包:Writerequst,简写为WRQ,对应Opcode字段值为2 ·l文件数据包:Data,简写为DATA,对应Opcode字段值为3 ·l回...

weixin_30270561的博客 1851

详解 ➾【FTP服务工作原理及连接模式】

🟢 该章详细介绍了FTP服务工作原理(发出连接请求、建立FTP会话连接、数据传输、自动释放动态分配的端口)及连接模式(主动模式&被动模式)。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 1万+
上一篇: vs调试特别慢
下一篇: CString 判断是否全是数字
mincheat
博客等级 码龄17年 46粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值