现在的位置: 首页 > 编程语言 > 正文

《www.uml.org.cn》UML与代码学习–利用有限状态机实现FTP 文件传输

2019年03月30日 编程语言 ⁄ 共 3412字 ⁄ 字号 评论关闭

(转,网络资源)

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

抱歉!评论已关闭.