65.9K
CodeProject 正在变化。 阅读更多。
Home

高级 FTP 服务器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.78/5 (25投票s)

2009年10月21日

CPOL

7分钟阅读

viewsIcon

135952

downloadIcon

20214

允许通过 FTP 远程访问您的文件和文件夹。

引言

我经常遇到这种情况,比如我不在家,可能需要从我的系统访问一些文件或参考资料。所以,我可以打电话让家里任何人打开我的电脑。这样,FTP服务器就会启动,我就可以从任何地方访问我的文件和文件夹了。这个 FTP 服务器是使用 C# .NET 设计的,可以从远程位置完全控制该应用程序。

独特的功能

市面上有许多免费的 FTP 服务器应用程序。但那些应用程序不提供远程控制服务器的功能,有些则通过在远程计算机上安装所需的软件来实现此功能,但这并非总是可行。但这个应用程序提供了一个简单、用户友好的 Web 界面,您可以从远程计算机通过浏览器连接。这使得可以从远程计算机控制该应用程序。您可以远程设置用户的主目录来添加新用户。这使得您可以允许其他人使用您的系统,并对某些操作和特定路径进行限制。

AdvancedFTPServer 的概念/代码背后

一旦 Windows 启动,一个名为 AdvFtpSvr 的服务就会启动,并从安装路径执行 FTP Server.exe。应用程序启动后,进程会自行结束,因为没有其他工作要做。您可能会问,为什么使用 Windows 服务而不是直接启动应用程序? 原因是 Windows 服务会在 Windows 启动时立即启动,并且由 Windows 服务启动的任何进程都拥有对系统的完全访问权限,从而可以访问所有文件和文件夹。除了 Windows 服务,我们还可以使用 Windows 计划任务,但其缺点是计划任务在某些系统中可能已被禁用,并非完全自动化的操作方式。

让我们先看看一些基本且有趣的方法。我们大多数人都知道,对于 FTP 服务器编程,我们需要使用监听器类监听某个端口(21)。通常,当监听器启动时,系统防火墙会阻止应用程序接收任何传入连接。因此,为了使应用程序正常工作,必须配置防火墙,为应用程序添加例外。通过安装程序中的自定义操作,防火墙例外添加已自动化。

来自 InstallerService.cs 的一个方法如下:

void AddToFirewallException(string ApplicationName, string FilePath)
{
    // Add exception to windows firewall after installation
    string RegPath =
        @"SYSTEM\ControlSet001\Services\SharedAccess\Parameters\
		FirewallPolicy\StandardProfile\AuthorizedApplications\List";
    string KeyValue = FilePath + ":*:Enabled:" + ApplicationName;

    RegistryKey Key = Registry.LocalMachine.OpenSubKey(RegPath, true);
    Key.SetValue(FilePath, KeyValue);
    Key.Close();
    Key = null;
}

上述方法接受两个 string 参数,即 ApplicationName (显示在 Windows 防火墙例外列表中的名称)和 FilePath (可执行文件的物理路径)。

设置文件(Settings.DAT)是一个加密的 XML 文件。加密和解密都通过下面描述的单一方法完成。

来自 Settings.csApplicationSettings 类的某个方法 - 该类使用 static 方法和属性存储所有应用程序设置。

static byte[] Crypt(byte[] Buffer)
{
    for (int i = 0; i < Buffer.Length; i++)
    {
        Buffer[i] ^= 36;
    }
    return Buffer;
}

上述方法接受一个字节数组作为输入参数,然后处理每个字节,最后返回加密后的字节数组。该方法使用一种非常简单的方式加密数据,但足以防止手动访问文件。

应用程序中实现了许多此类有趣的小方法。

现在让我们深入了解实现。一旦应用程序启动,首先会解密“Settings.dat”并加载到内存中。然后根据设置启动 FTP 和 HTTP 监听器。监听器启动后,就可以准备好响应客户端的请求了。

首先,我们将简要讨论 FTP 实现。

FTP 服务器包含三个类:

  • FTPServer FTPServer.cs 中 - 这是包含监听器的类。
  • FTPClient FTPClient.cs 中 - 这是包含服务 FTP 客户端所需的所有方法的类。
  • FTPUser FTPUser.cs 中 - 这是包含所有用户权限设置的类。

现在让我们讨论 FTPServer 类中的方法。

  • Start - 这个方法启动监听器监听指定端口的客户端,并在新客户端到达时触发 NewFTPClientArrived 方法。
  • Stop - 停止监听器类监听客户端。
  • NewFTPClientArrived - 每当有新客户端到达时,都会自动触发此方法。它创建一个新的 FTPClient 类对象,并将该对象存储在一个本地数组列表中。

以上是 FTPServer 类的内容。现在让我们开始讨论 FTPClient 类中的方法。

一旦在 FTPServer 类中创建了 FTPClient 类的对象,它就开始监听客户端的命令。FTP 实现有一大堆预定义命令。请参阅本文底部的参考部分,获取描述每个方法及其实现的链接。一旦客户端发送用户名和密码,CommandReceived 方法就会在列表中检查用户名和密码,并创建一个 FTPUser 类的对象,该对象包含特定用户的全部权限信息。这就是 FTP 实现类的全部内容。

现在让我们简要讨论一下 ApplicationLog 类。

ApplicationLog 类是一个简单的类,包含一个名为 Write 的单一 static 方法。这用于将应用程序错误事件写入 XML 文件,以便进行错误修复和跟踪一些应用程序更改。该 write 方法在整个项目中从 catch 块内部调用,并将捕获到的异常传递过去。

最后,让我们简要讨论一下 HTTP 实现类,然后继续介绍应用程序的使用指南。HTTP 实现类与 FTP 实现类相同,只是所有使用的命令不是预定义的,而是由我定义的。与 FTP 类不同,它不处理文件和文件夹。它只处理 HTML 代码,这些代码作为每个命令的响应发送。所有响应页面都存储在应用程序的资源部分,并在需要时请求。

来自 HTTPClient 类的一个方法如下:

void SendData(byte[] ResponseBody)
{
    if (ClientSocket.Connected)
        ClientSocket.Send(ResponseBody, ResponseBody.Length, SocketFlags.None);
}

上述方法以字节数组的形式将响应发送给客户端。

void SendHeader(int TotalBytes, string StatusCode, string ContentType)
{
    string ResponseHeader = HttpVersion + " " + StatusCode + "\r\n";
    ResponseHeader += "Server: AdvancedFTPServer/2.5\r\n";
    ResponseHeader += "Date: " + DateTime.Now.ToString("r") + "\r\n";
    ResponseHeader += "Content-Type: " + ContentType + "\r\n";
    ResponseHeader += "Accept-Ranges: bytes\r\n";
    ResponseHeader += "Content-Length: " + TotalBytes + "\r\n\r\n";

    SendData(Encoding.ASCII.GetBytes(ResponseHeader));
}

该方法向客户端发送响应头,在发送响应头后,接下来的字节必须包含响应正文(即 HTML 代码)。响应正文可以使用相同的 SendData 方法发送,该方法接受字节数组作为参数。

现在我们已经完成了所有主要类和方法的介绍,让我们继续。

使用安装程序

首先从上面提供的链接下载并安装安装程序,然后重新启动系统。您将在系统托盘中看到一个新图标。右键单击托盘图标可显示上下文菜单选项,如下所示。我已添加应用程序的屏幕截图。代码不言自明,我没有太多时间详细解释功能或代码。Web 身份验证的默认用户名和密码是“admin”和“admin”,HTTP 服务器的默认端口是 9090。要从本地系统连接到 Web 界面,只需单击下方上下文菜单中的“打开 HTTP”菜单。

上下文菜单

用户账户屏幕

添加/编辑用户屏幕

Web 界面

有关更多帮助,请在以用户名和密码(默认是“admin”和“admin”)进行身份验证后,单击以上屏幕中的帮助菜单。

参考原始 FTP 命令列表

其他支持性工具

当您从远程位置使用此功能时,您需要一个外部 IP 地址。如果您的外部 IP 是动态生成的,那么您需要一个自动系统来即时通知您的 IP。我使用 IPMon 来实现此目的。

注意

  • 安装程序安装后,系统需要重启才能使应用程序正常工作。
  • 上面提供的安装程序链接还会安装一个服务,因为服务器必须在 Windows 启动时立即启动。
  • 安装程序会自动为应用程序在 Windows 防火墙中添加一个例外。如果您安装了其他防火墙,则需要手动添加例外或将其添加到防火墙的允许/受信任列表中,以使应用程序正常工作。
  • 所有设置都存储在 DAT 文件中,并进行了简单的加密,以防止手动查看信息。

关注点

此源代码还包含:

  • 用于添加防火墙例外的代码片段
  • 使用 C# 开发 Windows 服务
  • 使用 MSI 部署 Windows 服务
  • 向 MSI 添加自定义操作
  • 一种简单的加密方法

历史

  • 2009 年 10 月 24 日 - 已添加缺失的资源文件 [Settings.xml]
© . All rights reserved.