C# - Ftp协议实现

时间:2011-02-16 10:10:21

标签: c# ftp network-protocols

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

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

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

运作良好的部分:

  • OpenControlChannel
  • ReadControl(横幅消息)
  • SendUser
  • ReadControl(等待通行证?)
  • SendPass
  • ReadControl(欢迎辞)
  • SendPassive
  • ReadControl(为DataChannel提取IP)

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

  • RETR myFile
  • OpenDataChannel
  • ReadControl(这里我成为了“开始转移”的消息 在阅读之前,“转移完成” 任何数据!)
  • READDATA
  • CloseDataChannel
  • CloseControlChannel

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

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

  

“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"

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

1 个答案:

答案 0 :(得分:0)

我认为这种行为是正常的,它会在服务器端的缓存中预加载数据并发送消息,以便说明数据可用并加载。

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

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