溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何利用有限狀態(tài)機(jī)實(shí)現(xiàn)FTP文件傳輸

發(fā)布時(shí)間:2021-10-14 13:57:03 來(lái)源:億速云 閱讀:139 作者:柒染 欄目:編程語(yǔ)言

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)如何利用有限狀態(tài)機(jī)實(shí)現(xiàn)FTP文件傳輸,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

函數(shù)說(shuō)明
對(duì)于FTP 文件傳輸,采用C++的類來(lái)實(shí)現(xiàn),定義了一個(gè)FTPClient 的C++類,在該類
對(duì)象定義了6 個(gè)公共函數(shù):Init( )、SendFile( )、ReceiveFile( )、Do( )、Resume( )和Stop( )
函數(shù)。下面對(duì)各個(gè)函數(shù)作詳細(xì)介紹。
(1) int Init(char *host, char *FTPusername, char *FTPpassword, unsigned
long timeout, int FTPMode );
功能描述:
初始化設(shè)置FTP 文件傳輸參數(shù)。
輸入?yún)?shù):
英創(chuàng)信息技術(shù)有限公司 嵌入式系統(tǒng)應(yīng)用程序方案之二
www.emtronix.com 2 028-86180660
char *host 遠(yuǎn)端主機(jī)的IP 地址,如“192.168.201.34”。
char *FTPusername 登錄時(shí)使用的用戶名,如“guest”
char *FTPpassword 登錄時(shí)使用的密碼,如“888”
unsigned long timeout 定義的timeout 時(shí)間,單位為毫秒。
int FTPMode 登錄FTP 的模式,= 0 為標(biāo)準(zhǔn)模式
= 1 為passive 模式
返回值:
!=0 該函數(shù)調(diào)用失敗
=0 該函數(shù)調(diào)用成功
備注:
該函數(shù)只需要在系統(tǒng)初始化時(shí)調(diào)用一次。
(2) int SendFile( char *file, int mode );
功能描述:
以FTP 客戶端方式,啟動(dòng)向遠(yuǎn)端FTP 服務(wù)器發(fā)送文件。
輸入?yún)?shù):
char *file 被操作的文件名,如“myfile.txt”。
int mode =0; 從遠(yuǎn)端服務(wù)器發(fā)送ASCII 文件
=1;從遠(yuǎn)端服務(wù)器發(fā)送2 進(jìn)制文件
返回值:
!=0 該函數(shù)調(diào)用失敗
=0 該函數(shù)調(diào)用成功
(3) int ReceiveFile( char *file, int mode );
功能描述:
以FTP 客戶端方式啟動(dòng)從遠(yuǎn)端FTP 服務(wù)器獲取文件。
輸入?yún)?shù):
char *file 被操作的文件名,如“myfile.txt”。
int mode =0; 從遠(yuǎn)端服務(wù)器獲取ASCII 文件
=1;從遠(yuǎn)端服務(wù)器獲取2 進(jìn)制文件
英創(chuàng)信息技術(shù)有限公司 嵌入式系統(tǒng)應(yīng)用程序方案之二
www.emtronix.com 3 028-86180660
返回值:
!=0 該函數(shù)調(diào)用失敗
=0 該函數(shù)調(diào)用成功
(4) int Do( )
功能描述:
以FTP 客戶端方式,執(zhí)行遠(yuǎn)端FTP 服務(wù)器發(fā)送文件或從遠(yuǎn)端FTP 服務(wù)器獲取文件,
只有當(dāng)該函數(shù)的返回值為0 時(shí)才表明FTP 文件傳輸成功。
返回值:
= 0 FTP 文件傳輸成功。
< 0 FTP 文件傳輸失敗,并返回相應(yīng)的錯(cuò)誤代碼。
> 0 FTP 文件傳輸過(guò)程中的各個(gè)狀態(tài)。
(5) int Resume( );
功能描述:
在調(diào)用Do( )函數(shù)返回FTP 傳輸失敗時(shí),可通過(guò)調(diào)用該函數(shù)啟動(dòng)文件斷點(diǎn)續(xù)傳功能,再
配合調(diào)用Do( )函數(shù)完成文件剩余部分的傳輸。
(6) int Stop( );
功能描述:
終止當(dāng)前的FTP 文件傳輸。
函數(shù)調(diào)用
在具體的應(yīng)用中,首先調(diào)用Init( )函數(shù)初始化設(shè)置FTP 傳輸?shù)南嚓P(guān)參數(shù),并通過(guò)
SendFile( )、RecieveFile( )函數(shù)來(lái)啟動(dòng)FTP 文件傳輸,然后應(yīng)用程序不斷調(diào)用Do( )函數(shù)進(jìn)
行FTP 文件傳輸,應(yīng)用程序可直接通過(guò)檢查該函數(shù)的返回值來(lái)判斷FTP 文件傳輸是否成功。
在我們提供的例程APP2.PRJ,利用FTPCLient 類提供的這些函數(shù)來(lái)實(shí)現(xiàn)FTP 文件傳輸任
務(wù)。通過(guò)CMD_TICK 來(lái)啟動(dòng)FTP 文件傳輸任務(wù)CMD_FTP, CMD_TICK 是系統(tǒng)自動(dòng)產(chǎn)生。
英創(chuàng)信息技術(shù)有限公司 嵌入式系統(tǒng)應(yīng)用程序方案之二
www.emtronix.com 4 028-86180660
在執(zhí)行CMD_FTPDO 中調(diào)用函數(shù) Do( ),通過(guò)其返回值來(lái)判斷FTP 文件傳輸是否完成,如
果沒(méi)有完成就繼續(xù)發(fā)送該命令,這樣程序就不會(huì)阻塞在FTP 文件傳輸過(guò)程中,在這其間還
可以執(zhí)行別的操作,比如說(shuō)中斷產(chǎn)生的命令。如果返回值<0 表明FTP 文件傳輸失敗,此時(shí)
可調(diào)用 Resume( )啟動(dòng)文件斷點(diǎn)續(xù)傳,在發(fā)送CMD_FTPDO 命令來(lái)繼續(xù)文件剩余部分的傳
輸。
下面主程序的代碼作相關(guān)的說(shuō)明。
主程序代碼分析
int SysInit( ); // 系統(tǒng)初始化函數(shù)定義
int SysExit( ); // 系統(tǒng)退出處理
int main( )
{
int i1, len, FirstFlag, ExitFlag; // 局部變量
CMD CmdCode; // 系統(tǒng)命令枚舉變量
char FTPFileName[40];
long xlen;
PPPGPRSState PPPState;
unsigned char OwnIPStr[20];
union CMD_PARAMETER ThisPar; // 系統(tǒng)命令所帶參數(shù)
i1 = SysInit( argc, argv ); // 首先進(jìn)行初始化
for( FirstFlag=0, ExitFlag=0; ; ) // 系統(tǒng)主循環(huán)
{
//ReloadWDT( ); // 加載watchdog
CmdCode = CmdQueue.GetCmd( (char*)&ThisPar ); // 從系統(tǒng)任務(wù)隊(duì)列讀取命令
switch( CmdCode )
{
case CMD_NOP:
PPPState = PPP_Running( ); // GPRS 自動(dòng)撥號(hào)上網(wǎng)
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;
英創(chuàng)信息技術(shù)有限公司 嵌入式系統(tǒng)應(yīng)用程序方案之二
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;
英創(chuàng)信息技術(shù)有限公司 嵌入式系統(tǒng)應(yīng)用程序方案之二
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

上述就是小編為大家分享的如何利用有限狀態(tài)機(jī)實(shí)現(xiàn)FTP文件傳輸了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

ftp
AI