文件传送协议(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、英创公司提供相应的测试例程,感兴趣的客户可向英创索要相关代码。
|