我決定在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字節。但是,如果這不是普通的行爲,那麼我就回到原點了。欣賞任何想法。
並非所有的服務器都支持'SIZE',因爲直到[RFC 3659](https://tools.ietf.org/html/rfc3659)才被標準化。爲了簡單檢測EOF,傳輸模式本身足以告訴您傳輸何時完成。參見[RFC 959](https://tools.ietf.org/html/rfc959)第3.4節。在STREAM模式下(通常情況下),文件末尾由關閉數據套接字的發件人表示(並且是的,服務器將在檢索時關閉套接字,因此您必須確保正確檢測到該關閉)。在BLOCK模式下,數據以塊的形式發送,並且在傳輸結束時會有一個EOF塊。 –