Ftp客户端概要设计
Ftp客戶端概要設計
1.概述
? ? ? ? ftp是基于TCP的文件傳輸協議,主要是用于控制遠程文件,如下載、上傳、續傳、重命名、刪除等。其命令是基于可見字符,易于理解的方式交互的。客戶端與服務器端的交互遵循一應一答的方式,而且各命令間遵循一定的順序。
FTP的應答原則:
a.??????所有應答都以3個數字開頭以“\r\n”結束
b.?????一個應答的第4位如果為’-’,表示還有后續應答,說明一個命令對應了多個應答
c.??????對應一個命令的多個應答,其前面的3個數字一樣
d.?????非命令的傳輸都需要開通另外的通道,并且事先需要說明是主動還是被動
FTP客戶端需要實現的功能:
a.??????登錄、退出
b.?????列出指定路徑下的所有文件名稱
c.??????下載文件
d.?????上傳文件
e.??????續傳文件(上傳和下載)
f.??????創建目錄
g.?????重命名文件
功能要求:
a.??????同時可以上傳和下載多個文件,并不相互影響;
b.?????隨時可以終止正在上傳或下載的文件,并后續續傳;
c.??????在上傳和下載的過程中不影響其他命令的執行;
d.?????上傳和下載文件可以顯示進度信息
?
2.模塊設計
? ? ? ? ?根據概述中的說明,建立如下的模塊關系:
? ? ? ? 對外操作的接口最終轉入控制實例中操作。對于外部傳入的ftp基本信息(如服務器名、端口號、用戶名密碼等信息)需存入基本信息模塊。操作模塊依賴基本信息模塊和傳輸控制模塊。一個操作模塊完成簡單的一次操作,如列出文件列表、上傳文件、下載文件。如果需要多個上傳或者下載操作則創建多個操作模塊。
控制實例的主要作用是:有效組織一個或多個操作模塊。
?
?
3.接口設計
由于時間關系,這邊實現概述中部分功能。
/**
?*????????? 設置當前字符集
?*/
bool SetCharset(char* charSet);
?
/**
?*????????? 登錄ftp服務器
?*@host???????????????????? 主機名稱,IP地址或者域名
?*@port???????????????????? ftp服務器端口,默認可以填21
?*@userName?????????? ftp用戶名,為NULL表示匿名登錄
?*@password??????????? 用戶名對應的密碼
?*@return?????????? 登錄成功返回true,否則返回false
?*/
bool Login(char* host,unsigned shortport,char* userName,char* password);
?
/**
?*????????? 退出ftp服務器,會中斷所有傳輸操作
?*@return?????????? 登錄成功返回true,否則返回false
?*/
bool Logout();
?
/**
?*????????? 創建目錄
?*@dirPath? 以'/'開頭,必須為絕對路徑
?*/
bool Mkdir(char* dirPath);
?
/**
?*????????? 將本地文件上傳到服務器上
?*@localFile????????????? 本地文件
?*@remoteFile????????? 服務器的文件(絕對路徑)
?*@callback???????????? 傳輸回調函數,參考FtpTransferCallback的定義
?*@lpcontext????????? ??回調函數的上下文參數
?*@return?????????????? 返回控制句柄,通過該句柄可以終端傳輸等
?*/
int PutFile(char* localFile,char*remoteFile,FtpTransferCallback callback,LPVOID lpcontext);
?
/**
?*????????? 將內存中的數據上傳到服務器上的文件中保存
?*@buffer????????? 內存中的數據
?*@nLen?????????????????? 數據長度
?*@remoteFile?????????? 服務器的文件(絕對路徑)
?*@callback???????????? 傳輸回調函數,參考FtpTransferCallback的定義
?*@lpcontext??????????? 回調函數的上下文參數
?*@return?????????????? 返回控制句柄
?*/
int PutBuffer(BYTE* buffer,int nLen,char*remoteFile,FtpTransferCallback callback,LPVOID lpcontext);
?
/**
?*????????? 獲取下載服務器上的文件
?*@remoteFile????????? 服務器上的路徑(絕對路徑)
?*@localFile????????????? 本地文件路徑
?*@callback???????????? 傳輸回調函數,參考FtpTransferCallback的定義
?*@lpcontext??????????? 回調函數的上下文參數
?*@return?????????????? 返回控制句柄
?*/
int GetFile(char* remoteFile,char*localFile,FtpTransferCallback callback,LPVOID lpcontext);
?
/**
?*????????? 下載服務器上的文件到指定的內存中
?*@remoteFile????????? 服務器上的文件(絕對路徑)
?*@buffer????????? 指定的內存
?*@nLen?????????????????? 可用的內存大小
?*@callback???????????? 傳輸回調函數,參考FtpTransferCallback的定義
?*@lpcontext??????????? 回調函數的上下文參數
?*@return?????????????? 返回控制句柄
?*/
int GetFileToBuffer(char* remoteFile,BYTE*buffer,int nLen,FtpTransferCallback callback,LPVOID lpcontext);
?
/**
?*????????? 在ftp服務器上查找相應的文件
?*@findFile??????? 需要查找的文件(絕對路徑),查找絕對路徑下的所有文件
?*@return?????????? 成功返回查找到的文件個數
?*???????????????? 沒有找到文件則返回0
?*/
int?? FindFile(char*findFile);
?
/**
?*????????? 獲取下一個文件信息
?*@lpFileInfo?????????? 文件屬性
?*@return?????????? 成功返回true,遍歷完或失敗返回false
?*/
bool NextFile(OUT LPFtpFileInfolpFileInfo);
?
附件1 FTP命令表:
| 命令 | 描述 |
| ABOR | 中斷數據連接程序 |
| ACCT <account> | 系統特權帳號 |
| ALLO <bytes> | 為服務器上的文件存儲器分配字節 |
| APPE <filename> | 添加文件到服務器同名文件 |
| CDUP <dir path> | 改變服務器上的父目錄 |
| CWD <dir path> | 改變服務器上的工作目錄 |
| DELE <filename> | 刪除服務器上的指定文件 |
| HELP <command> | 返回指定命令信息 |
| LIST <name> | 如果是文件名列出文件信息,如果是目錄則列出文件列表 |
| MODE <mode> | 傳輸模式(S=流模式,B=塊模式,C=壓縮模式) |
| MKD <directory> | 在服務器上建立指定目錄 |
| NLST <directory> | 列出指定目錄內容 |
| NOOP | 無動作,除了來自服務器上的承認 |
| PASS <password> | 系統登錄密碼 |
| PASV | 請求服務器等待數據連接 |
| PORT <address> | IP 地址和兩字節的端口 ID |
| PWD | 顯示當前工作目錄 |
| QUIT | 從 FTP 服務器上退出登錄 |
| REIN | 重新初始化登錄狀態連接 |
| REST <offset> | 由特定偏移量重啟文件傳遞 |
| RETR <filename> | 從服務器上找回(復制)文件 |
| RMD <directory> | 在服務器上刪除指定目錄 |
| RNFR <old path> | 對舊路徑重命名 |
| RNTO <new path> | 對新路徑重命名 |
| SITE <params> | 由服務器提供的站點特殊參數 |
| SIZE <filename> | 獲取服務器上文件的大小 |
| SMNT <pathname> | 掛載指定文件結構 |
| STAT <directory> | 在當前程序或目錄上返回信息 |
| STOR <filename> | 儲存(復制)文件到服務器上 |
| STOU <filename> | 儲存文件到服務器名稱上 |
| STRU <type> | 數據結構(F=文件,R=記錄,P=頁面) |
| SYST | 返回服務器使用的操作系統 |
| TYPE <data type> | 數據類型(A=ASCII,E=EBCDIC,I=binary) |
| USER <username>> | 系統登錄的用戶名 |
?
附件2 FTP響應表:
| 響應代碼 | 解釋說明 |
| 110 | 新文件指示器上的重啟標記 |
| 120 | 服務器準備就緒的時間(分鐘數) |
| 125 | 打開數據連接,開始傳輸 |
| 150 | 打開連接 |
| 200 | 成功 |
| 202 | 命令沒有執行 |
| 211 | 系統狀態回復 |
| 212 | 目錄狀態回復 |
| 213 | 文件狀態回復 |
| 214 | 幫助信息回復 |
| 215 | 系統類型回復 |
| 220 | 服務就緒 |
| 221 | 退出網絡 |
| 225 | 打開數據連接 |
| 226 | 結束數據連接 |
| 227 | 進入被動模式(IP 地址、ID 端口) |
| 230 | 登錄因特網 |
| 250 | 文件行為完成 |
| 257 | 路徑名建立 |
| 331 | 要求密碼 |
| 332 | 要求帳號 |
| 350 | 文件行為暫停 |
| 421 | 服務關閉 |
| 425 | 無法打開數據連接 |
| 426 | 結束連接 |
| 450 | 文件不可用 |
| 451 | 遇到本地錯誤 |
| 452 | 磁盤空間不足 |
| 500 | 無效命令 |
| 501 | 錯誤參數 |
| 502 | 命令沒有執行 |
| 503 | 錯誤指令序列 |
| 504 | 無效命令參數 |
| 530 | 未登錄網絡 |
| 532 | 存儲文件需要帳號 |
| 550 | 文件不可用 |
| 551 | 不知道的頁類型 |
| 552 | 超過存儲分配 |
| 553 | 文件名不允許 |
作者:wjh_2010@163.com
如果需要動態庫(共享庫)請以郵件的方式聯系作者。
?
總結
以上是生活随笔為你收集整理的Ftp客户端概要设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ARM的7种工作模式、37个通用寄存器、
- 下一篇: 交流电的有效值rms值_【电工基础知识: