您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關如何利用有限狀態機實現FTP文件傳輸,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
函數說明
對于FTP 文件傳輸,采用C++的類來實現,定義了一個FTPClient 的C++類,在該類
對象定義了6 個公共函數:Init( )、SendFile( )、ReceiveFile( )、Do( )、Resume( )和Stop( )
函數。下面對各個函數作詳細介紹。
(1) int Init(char *host, char *FTPusername, char *FTPpassword, unsigned
long timeout, int FTPMode );
功能描述:
初始化設置FTP 文件傳輸參數。
輸入參數:
英創信息技術有限公司 嵌入式系統應用程序方案之二
www.emtronix.com 2 028-86180660
char *host 遠端主機的IP 地址,如“192.168.201.34”。
char *FTPusername 登錄時使用的用戶名,如“guest”
char *FTPpassword 登錄時使用的密碼,如“888”
unsigned long timeout 定義的timeout 時間,單位為毫秒。
int FTPMode 登錄FTP 的模式,= 0 為標準模式
= 1 為passive 模式
返回值:
!=0 該函數調用失敗
=0 該函數調用成功
備注:
該函數只需要在系統初始化時調用一次。
(2) int SendFile( char *file, int mode );
功能描述:
以FTP 客戶端方式,啟動向遠端FTP 服務器發送文件。
輸入參數:
char *file 被操作的文件名,如“myfile.txt”。
int mode =0; 從遠端服務器發送ASCII 文件
=1;從遠端服務器發送2 進制文件
返回值:
!=0 該函數調用失敗
=0 該函數調用成功
(3) int ReceiveFile( char *file, int mode );
功能描述:
以FTP 客戶端方式啟動從遠端FTP 服務器獲取文件。
輸入參數:
char *file 被操作的文件名,如“myfile.txt”。
int mode =0; 從遠端服務器獲取ASCII 文件
=1;從遠端服務器獲取2 進制文件
英創信息技術有限公司 嵌入式系統應用程序方案之二
www.emtronix.com 3 028-86180660
返回值:
!=0 該函數調用失敗
=0 該函數調用成功
(4) int Do( )
功能描述:
以FTP 客戶端方式,執行遠端FTP 服務器發送文件或從遠端FTP 服務器獲取文件,
只有當該函數的返回值為0 時才表明FTP 文件傳輸成功。
返回值:
= 0 FTP 文件傳輸成功。
< 0 FTP 文件傳輸失敗,并返回相應的錯誤代碼。
> 0 FTP 文件傳輸過程中的各個狀態。
(5) int Resume( );
功能描述:
在調用Do( )函數返回FTP 傳輸失敗時,可通過調用該函數啟動文件斷點續傳功能,再
配合調用Do( )函數完成文件剩余部分的傳輸。
(6) int Stop( );
功能描述:
終止當前的FTP 文件傳輸。
函數調用
在具體的應用中,首先調用Init( )函數初始化設置FTP 傳輸的相關參數,并通過
SendFile( )、RecieveFile( )函數來啟動FTP 文件傳輸,然后應用程序不斷調用Do( )函數進
行FTP 文件傳輸,應用程序可直接通過檢查該函數的返回值來判斷FTP 文件傳輸是否成功。
在我們提供的例程APP2.PRJ,利用FTPCLient 類提供的這些函數來實現FTP 文件傳輸任
務。通過CMD_TICK 來啟動FTP 文件傳輸任務CMD_FTP, CMD_TICK 是系統自動產生。
英創信息技術有限公司 嵌入式系統應用程序方案之二
www.emtronix.com 4 028-86180660
在執行CMD_FTPDO 中調用函數 Do( ),通過其返回值來判斷FTP 文件傳輸是否完成,如
果沒有完成就繼續發送該命令,這樣程序就不會阻塞在FTP 文件傳輸過程中,在這其間還
可以執行別的操作,比如說中斷產生的命令。如果返回值<0 表明FTP 文件傳輸失敗,此時
可調用 Resume( )啟動文件斷點續傳,在發送CMD_FTPDO 命令來繼續文件剩余部分的傳
輸。
下面主程序的代碼作相關的說明。
主程序代碼分析
int SysInit( ); // 系統初始化函數定義
int SysExit( ); // 系統退出處理
int main( )
{
int i1, len, FirstFlag, ExitFlag; // 局部變量
CMD CmdCode; // 系統命令枚舉變量
char FTPFileName[40];
long xlen;
PPPGPRSState PPPState;
unsigned char OwnIPStr[20];
union CMD_PARAMETER ThisPar; // 系統命令所帶參數
i1 = SysInit( argc, argv ); // 首先進行初始化
for( FirstFlag=0, ExitFlag=0; ; ) // 系統主循環
{
//ReloadWDT( ); // 加載watchdog
CmdCode = CmdQueue.GetCmd( (char*)&ThisPar ); // 從系統任務隊列讀取命令
switch( CmdCode )
{
case CMD_NOP:
PPPState = PPP_Running( ); // GPRS 自動撥號上網
if( PPPState!=PPPLINKUP )
break;
if( FirstFlag==0 )
{
GetOWNIP( OwnIPStr );
printf( "/nIP=%d.%d.%d.%d/n", OwnIPStr[0], OwnIPStr[1], OwnIPStr[2],
OwnIPStr[3] );
FirstFlag = 1;
英創信息技術有限公司 嵌入式系統應用程序方案之二
www.emtronix.com 5 028-86180660
}
break;
case CMD_TICK: // on every 55ms
if( !FirstFlag ) break;
if( FTPDone ) break;
if( argc > 1 ) strcpy( FTPFileName, argv[1] );
else strcpy( FTPFileName, "ftpclnt2.exe" );
if( argc > 2 ) i1 = atoi( argv[2] );
else i1 = 3;
if( i1&0x02 )
{
printf( "send file %s/n", FTPFileName );
pFTPClnt->SendFile( FTPFileName, i1 );
}
else
{
printf( "receive file %s/n", FTPFileName );
pFTPClnt->ReceiveFile( FTPFileName, i1 );
}
CmdQueue.PushCmd( CMD_FTPDO );
FTPDone = 1;
break;
case CMD_FTPDO:
i1 = pFTPClnt->Do( );
if( i1 > 0 )
{
xlen = pFTPClnt->XLength( );
if( xlen >= 0 ) printf( "%2d %7ld /r", i1, xlen );
CmdQueue.PushCmd( CMD_FTPDO ); // keep going
}
else if( i1 < 0 )
{
printf( "/nFTP fail %d/n", i1 );
printf( "FTP resume!/n" );
pFTPClnt->Resume( );
CmdQueue.PushCmd( CMD_FTPDO ); // keep going
}
else
{
printf( "/nFTP do ok!/n" );
FTPDone = 0;
英創信息技術有限公司 嵌入式系統應用程序方案之二
www.emtronix.com 6 028-86180660
}
break;
default: ExitFlag = 1; // 非法命令,退出
}
if( ExitFlag ) break;
}
SysExit( );
return 0;
}
// return = 0: ok!
// < 0: fail
int SysInit( int argc, char** argv )
{
int i1;
pFTPClnt = new class FTPClientManager( );
pFTPClnt->Init( "222.210.195.109", "guest", "888", 10000, 0 );
//EnableWDT( 10.0 ); // 10 sec Watchdog
CmdQueue.StartQueue( );
return 0;
// Let's go to main loop!!
}
int SysExit( )
{
CmdQueue.StopQueue( );
delete pFTPClnt;
return 0;
// Let's go back to DOS
}
上述就是小編為大家分享的如何利用有限狀態機實現FTP文件傳輸了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。