TFTP的机制
服务端:TFTP端口为69,服务端将自身文件夹作为目录地址暴露在外,开启对应自身ip及69端口监听客户端请求
客户端:TFTP客户端以文件名来进行访问,服务端收到监听后查询对应目录是否存在相同名称文件,若存在,便允许客户端请求这个文件,客户端从服务端下载对应文件,交互完成。
1.nuget 搜索Tftp.net
2.查看对应源码 客户端与服务端构建
3.这边以实现TFTP服务端为例 TFTP 服务端帮助类
public class CommManagerTFTP
{
//懒加载
private static readonly Lazy<CommManagerTFTP> _default = new Lazy<CommManagerTFTP>(() => new CommManagerTFTP());
public static CommManagerTFTP _Default => _default.Value;
public static String ServerDirectory;
private TftpServer server;
public bool Init(IPAddress iPAddress, string FTPServerDirectory)
{
//从FTP下载下来的文件保存路径
ServerDirectory = FTPServerDirectory;
try
{
server = new TftpServer(iPAddress);
//读取事件
server.OnReadRequest += new TftpServerEventHandler(server_OnReadRequest);
//写入事件
server.OnWriteRequest += new TftpServerEventHandler(server_OnWriteRequest);
//开启服务
server.Start();
return true;
}
catch (Exception ex)
{
return false;
}
}
public bool Init(IPAddress iPAddress, int localport, string FTPServerDirectory)
{
//从FTP下载下来的文件保存路径
ServerDirectory = FTPServerDirectory;
try
{
server = new TftpServer(iPAddress, localport);
//读取事件
server.OnReadRequest += new TftpServerEventHandler(server_OnReadRequest);
//写入事件
server.OnWriteRequest += new TftpServerEventHandler(server_OnWriteRequest);
//开启服务
server.Start();
return true;
}
catch (Exception ex)
{
return false;
}
}
public bool Init(IPAddress iPAddress)
{
ServerDirectory = Environment.CurrentDirectory;
try
{
server = new TftpServer(iPAddress);
//读取事件
server.OnReadRequest += new TftpServerEventHandler(server_OnReadRequest);
//写入事件
server.OnWriteRequest += new TftpServerEventHandler(server_OnWriteRequest);
//开启服务
server.Start();
return true;
}
catch (Exception ex)
{
return false;
}
}
static void server_OnReadRequest(ITftpTransfer transfer, EndPoint client)
{
String path = Path.Combine(ServerDirectory, transfer.Filename);
FileInfo file = new FileInfo(path);
//Is the file within the server directory?
if (!file.FullName.StartsWith(ServerDirectory, StringComparison.InvariantCultureIgnoreCase))
{
CancelTransfer(transfer, TftpErrorPacket.AccessViolation);
}
else if (!file.Exists)
{
CancelTransfer(transfer, TftpErrorPacket.FileNotFound);
}
else
{
OutputTransferStatus(transfer, "Accepting request from " + client);
StartTransfer(transfer, new FileStream(file.FullName, FileMode.Open, FileAccess.Read));
}
}
static void server_OnWriteRequest(ITftpTransfer transfer, EndPoint client)
{
String file = Path.Combine(ServerDirectory, transfer.Filename);
if (File.Exists(file))
{
CancelTransfer(transfer, TftpErrorPacket.FileAlreadyExists);
}
else
{
OutputTransferStatus(transfer, "Accepting write request from " + client);
StartTransfer(transfer, new FileStream(file, FileMode.CreateNew));
}
}
private static void StartTransfer(ITftpTransfer transfer, Stream stream)
{
transfer.OnProgress += new TftpProgressHandler(transfer_OnProgress);
transfer.OnError += new TftpErrorHandler(transfer_OnError);
transfer.OnFinished += new TftpEventHandler(transfer_OnFinished);
transfer.Start(stream);
}
private static void CancelTransfer(ITftpTransfer transfer, TftpErrorPacket reason)
{
OutputTransferStatus(transfer, "Cancelling transfer: " + reason.ErrorMessage);
transfer.Cancel(reason);
}
static void transfer_OnError(ITftpTransfer transfer, TftpTransferError error)
{
OutputTransferStatus(transfer, "Error: " + error);
}
static void transfer_OnFinished(ITftpTransfer transfer)
{
OutputTransferStatus(transfer, "Finished");
}
static void transfer_OnProgress(ITftpTransfer transfer, TftpTransferProgress progress)
{
OutputTransferStatus(transfer, "Progress " + progress);
}
private static void OutputTransferStatus(ITftpTransfer transfer, string message)
{
//显示过程
//MessageBox.Show("[" + transfer.Filename + "] " + message);
Console.WriteLine("[" + transfer.Filename + "] " + message);
if (message == "Finished")
{
//MessageBox.Show("传输完成");
}
}
//断开连接
public void Dispose()
{
server.Dispose();
}
}
ps:
1.请注意,对应69端口可能需要添加防火墙入站规则,可以在防火墙中设置,也可cmd命令 netsh advfirewall firewall add rule name=TFTP dir=in action=allow protocol=UDP localport=69
2.请确保安装TFTP服务器软件:首先,你需要在Windows上安装TFTP服务器软件。这通常涉及到在控制面板中选择“程序和功能”,然后点击“打开或关闭Windows功能”。在“Windows功能”窗口中,你需要勾选“TFTP服务器”选项,然后点击“确定”按钮进行安装。