這篇文章是我本人編寫的 在網上也是絕無僅有
一開始發表在我的網易博客上了 結果被轉移且被誤傷 有可能存在某些字符或文字出錯的地方
有時間我會重新編寫, 目前大家先看着
ftp是建立在TCP鏈接的基礎上的
要想在單片機上實現FTP需要先實現TCP,如何實現(硬件軟件什麼的)我就不介紹了 網上一大堆,就是這個FTP沒有 這裏簡單介紹下
前提: 創建兩個鏈接,
1個位TCP客戶端連接到FTP服務器的IP和21端口上,
另外一個如果是PASV模式則空閒等待需要傳輸數據時鏈接到FTP服務器的指定端口上(客戶端模式,鏈接是需要用上一個鏈接命令發送PASV獲取端口和IP)
如果是PORT模式則另外一個鏈接爲服務器模式上電就開啓在需要傳輸數據時上一個鏈接先發送
(類似於 PORT 192,168,1,102,14,178 端口號爲14*256+178)的幀格式到FTP21端口讓FTP服務器知道鏈接那個端口發數據
下面只介紹PASV模式
FTP鏈接過程:
1 啓動服務器(如何啓動FTP服務器就不用說了吧)客戶端連接服務器21端口
2 服務器返回歡迎信息 類似 220 Welcome to JDFW FTP Server V4.0.0
3 客戶端發送登陸用戶名信息 類似 USER veryzhou
4 服務器返回用戶名正確信息要求密碼 類似 331 Password required for veryzhou
5 客戶端發送密碼信息 類似 PASS 123sssttt
6 服務器返回登陸成功信息 類似 230 Client :veryzhou successfully logged in. Client IP :192.168.1.102
可選命令: SYST 回覆 215 WINDOWS emulated by DXMSOFT. 確定服務器上運行的操作系統
REST 100 和 REST 0 回覆 350 Restarting at 100. 重新開始傳輸文件
PWD 回覆 257 "/" is current directory. 顯示當前路徑
PASV 回覆 227 Entering Passive Mode (192,168,1,102,4,0). 被動模式要求服務器監聽某個端口並返回給用戶,端口號爲4*256+0
LIST -al 回覆 150 Opening ASCII mode data connection for directory list. 獲取的文件列表信息
另一個鏈接吐出數據:
07-01-15 07:51PM 163 123.txt
07-01-15 08:04PM 38 53287.txt
後回覆 226 Transfer complete.
上傳一個文件:
發送 SIZE 53286666.txt 查詢53286666.txt的長度,或者說查詢這個文件是否存在
回覆 550 File not found. 如果不是需要改名 (或者創建不可能重名的文件,則不存在這個問題)
回覆 213 78 文件狀態(78字節)
發送 PASV
回覆 227 Entering Passive Mode (192,168,1,102,4,0). 被動模式要求服務器監聽某個端口並返回給用戶
創建TCP客戶端連接IP192.168.1.102端口4*256+0 鏈接成功後
發送 STOR 53286666.txt 保持另外一個鏈接的數據到文件53286666.txt,如果這個文件存在則覆蓋他
回覆 150 Opening BINARY mode data connection for file transfer.
另外一個鏈接發送文件內容 的空間撒謊的卡和數據庫的哈薩克覺得好看82374987349857983475983475798347598734
回覆(還是21這個鏈接)226 Transfer complete. 請求的文件操作成功 另外一個鏈接已經關閉
(ftp服務器判斷另外一個鏈接斷開即回覆這個,中間另外一個鏈接可以多次發送)
發送 SITE UTIME /53286666.txt 20150701124829 20150701124829 20150701124829 UTC 寫文件創建,修改,訪問時間
回覆 502 Command not implemented - Try HELP. 出錯可以不管他
這裏可以再次獲取列表信息判斷是否傳輸成功(其實沒必要)
還可以 刪除一個文件,讀取一個文件等待,如果有權限的話
上面任何一個回覆不成功即可中斷退出(即全部不成功)
退出FTP:
發送 QUIT
回覆 220 Bye 成功推出
關閉21那個鏈接即可