【问题标题】:C# - Ftp protocol implementationC# - Ftp 协议实现
【发布时间】:2011-02-18 05:24:21
【问题描述】:

在 Compact Framework 中,没有实现 Ftp 协议,所以我自己开发了。

我有一个关于被动模式和需要数据通道来读取响应的命令的问题。

就我而言,我正在尝试检索(RETR)我的 FTP 服务器上的文件,所以我这样做了:

运作良好的部分:

  • 开放控制频道
  • ReadControl(横幅消息)
  • 发送用户
  • ReadControl(等待通过?)
  • 发送密码
  • ReadControl(欢迎信息)
  • 被动发送
  • ReadControl(为 DataChannel 提取 IP)

不能很好工作的部分(但也能工作,请参阅下面的说明)

  • 返回我的文件
  • 开放数据通道
  • ReadControl(这里我变成消息“Begin Transfert”并且 “传输完成”,在阅读之前 任何数据!)
  • 读取数据
  • 关闭数据通道
  • 关闭控制频道

问题是,即使我没有读取流上的任何数据,我只需要打开数据通道即可获得“传输完成”消息,这种行为是否正常?

对我来说,当我打开数据通道时,我应该会收到

"150 打开ASCII模式数据 a.she 的连接(0 字节)。\r\n"

然后一旦读操作完成:

"226 传输完成。\r\n"

当我查看 .NET Framework 中使用的经典 Ftp 协议时,情况就是这样:

FtpWebResponse ftpres = (FtpWebResponse)ftp.GetResponse();
// ftpres.StatusDescription = "150 Opening ASCII mode data connection for a.she (0 bytes).\r\n" 
string res = new StreamReader(ftpres.GetResponseStream()).ReadToEnd();
// ftpres.StatusDescription = "226 Transfer complete.\r\n"

希望我足够清楚... 谢谢!

【问题讨论】:

  • 请注意 - 正确处理数据连接需要一系列技巧,因此通常使用一些现有的 .NET CF FTP 组件比尝试编写自己的组件更有意义。
  • 也许是的,但这不是问题 ;-)
  • @Eugene 除了它不处理像 MVS 这样的服务器所需的一些特殊命令。

标签: c# ftp network-protocols


【解决方案1】:

我认为这种行为是正常的,它将数据预加载到服务器端的缓存中并发送消息以表示数据可用并已加载。

这是因为当数据通道在 2 个服务器之间(而不是客户端/服务器模式)时,用户现在应该在传输完成后,所以它只查看这个缓存...

(编辑:在某些情况下,我收到消息的顺序似乎很好(只有一次数据读取),奇怪......)

【讨论】:

    最近更新 更多