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