1 概述
TFTP协议是基于UDP的简单文件传输协议,协议双方为Client和Server.Client和Server之间通过5种消息来传输文件,消息前两个字节Code是消息类型,消息内容随消息类型不同而不同。传输模式有三种:octet,netascii和mail,octet为二进制模式,netascii为文本模式,mail为文本模式,不过收到的文本不是保存到文件,而是打印出来,现在已不常用。DATA消息种数据长度是512字节,最后一个数据包可能会小于512。详见TFTP协议
本文描述如何利用C++基于Qt5.12实现TFTP的Server和Client。
2 概要设计
TFTP客户端通过GetFile来下载文件,通过PutFile上传文件。
2.1 序列图
- GetFile序列图
,----. ,----------. ,----------.|User| |TFTPClient| |TFTPServer|`-+--' `----+-----' `----+-----'| GetFile | | | -----------------> | | | | | | Request of get file over UDP| | | ----------------------------> | | | | | Reponse a file over UDP | | | <---------------------------- | | | | A File | | | <----------------- | ,-+--. ,----+-----. ,----+-----.|User| |TFTPClient| |TFTPServer|`----' `----------' `----------'
- PutFile序列图
,----. ,----------. ,----------.|User| |TFTPClient| |TFTPServer|`-+--' `----+-----' `----+-----'| PutFile | | | -----------------> | | | | | | Request of put file over UDP| | | ----------------------------> | | | | | Reponse ACK over UDP | | | <---------------------------- | | | | ACK | | | <----------------- | ,-+--. ,----+-----. ,----+-----.|User| |TFTPClient| |TFTPServer|`----' `----------' `----------'
2.2 类图
如图所示整个软件有8个类:
类型说明:
- TFTP类实现TFTP协议。
- TFtpServerFile类实现服务端文件收发。
- TFtpClientFile类实现客户端文件收发。
- BaseUdp类定义UDP写接口。
- ServerSocket类实现服务端UDP写接口。
- ClientSocket类实现客户端UDP写接口。
- TFtpServer类启动服务,等待客户端上传/下载文件。
- TFtpClient类连服务端来上传/下载文件。
2.3 模块划分
软件划分为如下模块:
- Core是一个静态库
- Server是一个EXE程序,调用Core库实现TFTP服务端功能。
- Client是一个EXE程序,调用Core库实现TFTP客户端功能。
2.3.1 Core
Core包括下面4个类:
- FTP
- BaseUdp
- TFtpServerFile
- TFtpClientFile
2.3.2 Server
Server包括下面3个类:
- ServerSocket
- TFtpServer
- TFtpServerWidget
2.3.3 Client
Client包括下面3个类:
- ClientSocke
- TFtpClient
- TFtpClientWidget