基于 WinInet.dll API 的 C# FTP 客户端






3.24/5 (33投票s)
2003年9月17日
2分钟阅读

258684

3143
WinInet.dll API 能够穿透防火墙 - 这个简单的 FTP 客户端即使在您的防火墙只开放 21 端口的情况下也能支持文件传输!
引言
当我需要向远程 FTP 服务器添加自动文件传输功能时,我发现有许多优秀的、清晰的、结构良好且文档完善的示例;无论是商业的还是私人的 - 但对我都毫无用处!我们的互联网访问是通过一个相当“受限”的防火墙进行的,似乎只开放了 21 端口。使用套接字实现 FTP 客户端的经典方法将在 21 端口(默认 FTP 端口)上打开“命令通道”,允许客户端登录等,但只要需要任何数据传输,就必须打开第二个“数据通道”(默认端口 20)。无论是主动模式还是被动模式,我都无法通过我们的防火墙建立第二个通道。
我本打算放弃并开始寻找新的雇主,但突然想到 Windows 资源管理器完全能够与我指向的任何 FTP 服务器交换数据……这运行在完全相同的防火墙上,所以这里发生了一些奇怪而有点神奇的事情。原来这其中的魔法就在 WinInet.dll 中。我仍然不确定 WinInet.dll 是如何工作的,它似乎在防火墙上打开了一点小小的缺口 - 但重要的是它有效!
为了使用 WinInet.dll 的 FTP 功能,我需要在 C# 中封装 API。这大部分过程都很顺利,除了字符串参数的编组 - 它是记录在案的,但你必须知道去哪里查找。完成这项工作后,我想把它提供给 C# 社区;也许我可以节省一些人很多令人沮丧的时间,试图穿透他的公司防火墙,但也是因为我确信我会得到很多有用的反馈……例如,为什么成功删除文件会返回错误代码 2 = 文件未找到?啊,API 编程的奥秘。
我包含了一个非常小的控制台应用程序来测试基本功能 - 默认 URL 是 ftp://ftp.microsoft.com/,邀请用户将其替换为他们自己的目标。