? ARM9工控主板支持断点续传的FTP文件传送--技术天地

ARM9工控主板支持斷點續傳的FTP文件傳送

 2009/8/21    

        文件傳送協議(FTP — File Transfer Protocol)是TCP/IP提供的標準機制,用來從一臺主機將文件復制到另一臺主機。從一臺計算機向另一臺計算機傳送文件是在聯網或互聯網環境中常見的任務。

        英創ARM9系列工控主板預裝正版WinCE5.0操作系統,WinCE內核提供了FTP Server應用程序,這為通過FTP實現文件傳送提供了方便,在本公司網站文章《ARM9工控主板WinCE應用程序的遠程FTP自動更新》中介紹的方案,就是利用WinCE內核提供的FTP Server實現的應用程序遠程更新。但在很多應用場合,是工控主板作為本地FTP客戶端與遠端FTP服務器交換文件,為此需要程序員自己編寫在ARM9主板上運行的FTP客戶端的程序。對于WinCE操作系統,Microsoft提供了如FtpGetFile()、FtpPutFile()等用于文件傳送的函數,程序員利用這些函數,可以方便的編寫出FTP客戶端程序。但如果網絡環境復雜或采用GPRS網絡,由于GPRS網絡原因,網絡連接很容易中斷,如果每次連接中斷,整個文件都重新傳送,一個稍大的文件基本上不能成功傳送,此時就要求FTP文件傳送具有斷點續傳功能。

        斷點續傳是指在文件的傳送過程中,因為網絡或其它原因至使傳送過程中斷,當再次傳送這個文件時,將從已傳送的部份開始,繼續未完成部份傳送,不用從頭對整個文件進行傳送,這樣可以節省時間,節約網絡流量,提高文件傳送速度。對于在GPRS網絡上應用的FTP,斷點續傳功能顯得尤為重要,但Microsoft提供的FTP API中,卻沒有支持斷點續傳的函數,為此,英創公司針對斷點續傳這一要求,直接采用SOCKET API,封裝了一個支持斷點續傳的FTP客戶端靜態庫EM_FTPClient.LIB,下面對這個庫函的API函數做詳細說明。

        支持斷點續傳的FTP庫函數說明:

(1)bool Logon( LPCTSTR lpszHostIP, LPCTSTR lpszUserName=_T(''), LPCTSTR lpszPassword=_T(''), int nTimeOut=5000 );
功能描述:登錄到FTP服務器
輸入參數 lpszHostIP:服務器IP
lpszUserName:用戶名
lpszPassword:用戶密碼(當用戶名用與用戶密碼為空時,將匿名登錄)
nTimeOut:超時設置 1000(mS)<=nTimeOut<=60000(mS)
返回值 = TRUE:登錄FTP服務器成功
FALSE:登錄FTP服務器失敗

(2)bool ChangeDir( LPCTSTR lpszRemoteDir=_T('\\') );
功能描述:設置遠端FTP服務器當前目錄
輸入參數 lpszRemoteDir:服務器目錄
返回值 = TRUE:目錄更改成功
FALSE:目錄更改失敗

(3)bool ListAll( FILELIST* fileList );
功能描述:獲取FTP服務器當前目錄下的所有文件的列表
輸入參數 fileList:接收文件列表的結構體
返回值 = TRUE:獲取文件列表成功
= FALSE:獲致文件列表失敗
文件列表數據結構定義如下:
typedef struct
{
        int nFileNum; //當前目錄文件個數
        TCHAR FileList[MAXFILENUM][MAX_PATH]; //文件名列表
//(注:當nFileNum = 0 時,此數組中的內容無效)
}FILELIST;

(4)bool GetFile( LPCTSTR lpszLocalFile, LPCTSTR lpszRemoteFile, int nMode = 0, bool bResume=FALSE );
功能描述:從FTP服務器上下載指定文件(如果下載的文件已存在于本地當前目錄下,將覆蓋下載)
輸入參數 lpszLocalFile:存儲為本地文件名
lpszRemoteFile:下載的指定文件
nMode:傳輸模式 =0: 二進制模式 =1: 文本模式
bResume:斷點續傳標志
=TRUE:繼點續傳
(程序將掛斷FTP連接,重新執行Logon(),ChangeDir(),然后下載)
=FALSE: 正常下載
返回值 = TRUE:開始下載
FALSE:開始下載失敗

(5)bool DelFile( LPCTSTR lpszFileName)
功能描述:刪除遠端FTP服務器當前目錄下指定文件
輸入參數 lpszFileName:指定要刪除的文件
返回值 = TRUE:刪除成功
FALSE:刪除失敗

(6)bool Logoff( );
功能描述:注銷與遠端FTP服務器的連接

(7)void Abort( );
功能描述:中斷與遠端FTP服務器的連接

(8)FTPSTATUS* GetStatus( );
功能描述:獲取當前文件的下載狀態
返回值: 指向當前下載文件狀態數據結構的指針
文件下載狀態數據結構定義如下:
typedef struct
{
        int nSucceed; //上傳/下載是否成功
        //=0:文件正在傳輸,=1文件傳輸成功,=-1文件傳輸失敗
        int nErrCnt; //重傳次數
        int nMode; //上傳=1,下載=2
        int nStatus; // FTP狀態
        DWORD dwFileSize; //文件字節數
        DWORD dwCompleteSize; // 已完成字節數
}FTPSTATUS;

(9)int GetErrorCode( );
功能描述:獲取最后一次錯誤的錯誤碼
返回值:錯誤碼(錯誤碼的定義請參看EM_FTPClient.H)

        補充說明:

        1、在調用GetFile()函數時,如果將bResum設置為TRUE,程序將自動執行以下步驟:
        ↓調用Abort( )中斷與FTP服務器的連接
        ↓調用Logon( )登錄到FTP服務器
        ↓調用ChangeDir( )設置FTP服務器當前目錄
        ↓從已完成傳送的部份繼續下載
        其中Logon()和ChangeDir( )的參數是最后一次調用Logon()和ChangeDir( )傳入的值。

        2、調用GetFile()函數返回為TRUE時,并不是表示文件下載成功,只表明文件開始下載。主程序應該通過判斷FTPSTATUS數據結構中的nSucceed值來確認下載是否成功。

        3、現在的FTP服務器普遍支持PASV模式,因此本FTP Client僅支持PASV模式數據傳送。

        4、英創公司提供相應的測試例程,感興趣的客戶可向英創索要相關代碼。