C# 实现开启TFTP服务

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服务器”选项,然后点击“确定”按钮进行安装。

  • 27
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值