我决定在C#中自己推出FTP套接字客户端以获得更多控制权,但主要是为了学习体验。但是我不知道在发出RETR命令后需要读取多少文件数据。我能够建立初始FTP通信连接,然后通过发出PASV命令和所有好东西来连接新端口上的第二个套接字。如何确定在FTP服务器上使用RETR时文件的结尾(PASV)
我的问题是,当我在通信端口上发出RETR命令时,FTP服务器开始通过被动端口发送文件,然后在通信端口上完成发送时发出226命令。我可以很好地接收数据,但有时在所有文件数据到达被动端口之前,226命令到达通信端口。所以,如果我在收到226命令后立即指示我的被动套接字任务停止读取,它有时会错过包含文件结尾的数据。我已经尝试在退出Socket.Receive循环之前检查Socket.Available,但通常情况下,Socket.Available将报告套接字上可用的0字节,但套接字并不意味着没有更多的数据办法。读取FTP规范似乎FTP服务器应该在完成发送所有数据后关闭数据连接,但我认为不会发生这种情况。我可以整天读取0字节的数据。我正在查看一个破损的FTP服务器,还是我在我的方法中做错了什么?
现在的一些额外的信息可能是我的问题的答案。使用连接到同一FTP服务器的Filezilla,我发现当请求文件时,FTP服务器将文件长度附加到括号中的150命令。例如,“150打开test.zip的BINARY模式数据连接(123421字节)”。这个文本是FTP标准的一部分吗?如果所有FTP服务器都使用这种相同的行为和格式,那么我可以继续阅读,直到我达到123,421字节。但是,如果这不是普通的行为,那么我就回到原点了。欣赏任何想法。
2014-03-03
forcedfx