如何利用有限状态机实现FTP文件传输
创始人
2024-12-26 01:40:49
0次

函数说明
对于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
} 

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...