⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ftp.c

📁 周立功公司2410开发板上所有基于UCOS开发的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:           ftp.c
** Last modified Date:  2004-09-16
** Last Version:        1.0
** Descriptions:        ZLG/FS-S V1.0
**
**------------------------------------------------------------------------------------------------------
** Created by:          Chenmingji
** Created date:        2004-09-16
** Version:             1.0
** Descriptions:        The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#define IN_FTP

#include "config.h"

/*********************************************************************************************************
**                  "全局和静态变量在这里定义"         
**        global variables and static variables define here
********************************************************************************************************/
static FTP_INFO FtpInfo[MAX_FTP_LINKS];

static OS_STK TraTaskStk[FtpLISTaskStkLengh];

//*********************************************************************************************************

    //110   重新启动标记应答。在这种情况下文本是确定的,它必须是:MARK yyyy=mmmm,其中yyyy是用户进程数据流标记,mmmm是服务器标记。
    //120   服务在nnn分钟内准备好
const static char CmdDly[] = "120 Delay 100\r\n";
    //125 数据连接已打开,准备传送
    //150 文件状态良好,打开数据连接
const static char ListStart[] = "150 connection for LIST.\r\n";
const static char RetrStart[] = "150 connection for GetFile .\r\n";

    //200 命令成功
const static char TypeInfo[] = "200 Type set to A.\r\n";
const static char TypeInfo1[] = "200 Type set to I.\r\n";
const static char CmdAccept[] = "200 Command okay.\r\n";
const static char PortAccept[] = "200 PORT Command successful.\r\n";
const static char ModeInfo[] = "200 MODE S ok.\r\n";
    //202 命令未实现
    //211 系统状态或系统帮助响应
    //212 目录状态
    //213 文件状态
    //214 帮助信息,信息仅对人类用户有用
    //215 名字系统类型
    const static char SysInfo[] = "215 EmbedOS File System.\r\n";
    //220 对新用户服务准备好
const static char NewUsr[] = "220 ZLG/FTPServer read...\r\n";
    //221 服务关闭控制连接,可以退出登录
const static char UsrQuit[] = "221 GoodBye!\r\n";
    //225 数据连接打开,无传输正在进行
    //226 关闭数据连接,请求的文件操作成功
const char TransferOk[] = "226 Transfer complete.\r\n";
const static char AbortInfo[] = "226 ABOR command successful.\r\n";

    //227 进入被动模式
            //"227 Entering Passive Mode"
    //230 用户登录
const static char UsrEnter[] = "230 User logged in, proceed.\r\n";
    //250 请求的文件操作完成
const static char CwdInfo1[] = "250 Directory changed to ";
const static char CwdInfo2[] = ".\r\n";
const static char DelOK[] = "250 DELE command successful.\r\n";
    //257 创建"PATHNAME"
const static char C257[] = "257  ";
const static char PathName1[] = "257 \"";
const static char PathName2[] = "\" is current directory.\r\n";
const static char MkdOK[] = "\" directory created.\r\n";
const static char RmdOK[] = "\" directory removed.\r\n";
    //331 用户名正确,需要口令
const static char UsrNameOK[] = "331 User name okay, please send complete E-mail address as password.\r\n";
    //332 登录时需要帐户信息
    //350 请求的文件操作需要进一步命令
const static char Restinfo1[] = "350 Restarting at ";
const static char Restinfo2[] = ". Send STORE or RETRIEVE.\r\n";
    //421 不能提供服务,关闭控制连接
const static char ServAvai[] = "421 Service not available, closing control connection.\r\n";
const static char MoreUsr[] = "421 Too many users - please try again later.\r\n";
    //425 不能打开数据连接
const static char TransNOk[] = "425 Can't open Transfer Link.\r\n";
    //426 关闭连接,中止传输
const static char CloseTra[] = "426 Data connection closed, transfer aborted by client.\r\n";
    //450 请求的文件操作未执行
const char FileNOpen[] = "450 Can't open this file.\r\n";
    //451 中止请求的操作:有本地错误
    //452 未执行请求的操作:系统存储空间不足
    //500 格式错误,命令不可识别
const static char BadCmd[] = "500 Bad Cammand\r\n";
    //501 参数语法错误
//const static char BadPar[] = "501 Bad Parameter\r\n";
    //502 命令未实现
const static char CmdNotAllow[] = "502 This Cammand didn't allow\r\n";
    //503 命令顺序错误
    //504 此参数下的命令功能未实现
const static char ParNotAllow[] = "504 Command not implemented for that parameter.\r\n";
    //530 未登录
const static char UsrNameNK[] = "530 Sorry, This UserName access didn't allow.\r\n";
    //532 存储文件需要帐户信息
    //550 未执行请求的操作
const static char PasvNotAllow[] = "550 Passive mode not allowed on this server.\r\n";
const static char C550[] = "550 ";
const static char DelNok[] = ": No such file or directory, Or Permission denied.\r\n";
const static char MkdNok[] = ": failed to create, Or Permission denied.\r\n";
    //551 请求操作中止:页类型未知
    //552 请求的文件操作中止,存储分配溢出
    //553 未执行请求的操作:文件名不合法


//*********************************************************************************************************
static uint8 CmdUser(char *Parameter, uint8 PLen, FTP_INFO *Fip);
static uint8 CmdPass(char *Parameter, uint8 PLen, FTP_INFO *Fip);
static uint8 CmdAcct(char *Parameter, uint8 PLen, FTP_INFO *Fip);
static uint8 CmdCwd(char *Parameter, uint8 PLen, FTP_INFO *Fip);
static uint8 CmdCdup(char *Parameter, uint8 PLen, FTP_INFO *Fip);
static uint8 CmdSmnt(char *Parameter, uint8 PLen, FTP_INFO *Fip);
static uint8 CmdRein(char *Parameter, uint8 PLen, FTP_INFO *Fip);
static uint8 CmdQuit(char *Parameter, uint8 PLen, FTP_INFO *Fip);

static uint8 CmdPort(char *Parameter, uint8 PLen, FTP_INFO *Fip);
static uint8 CmdPasv(char *Parameter, uint8 PLen, FTP_INFO *Fip);
static uint8 CmdType(char *Parameter, uint8 PLen, FTP_INFO *Fip);
static uint8 CmdStru(char *Parameter, uint8 PLen, FTP_INFO *Fip);
static uint8 CmdMode(char *Parameter, uint8 PLen, FTP_INFO *Fip);

static uint8 CmdRetr(char *Parameter, uint8 PLen, FTP_INFO *Fip);
static uint8 CmdStor(char *Parameter, uint8 PLen, FTP_INFO *Fip);
static uint8 CmdStou(char *Parameter, uint8 PLen, FTP_INFO *Fip);
static uint8 CmdAppe(char *Parameter, uint8 PLen, FTP_INFO *Fip);
static uint8 CmdAllo(char *Parameter, uint8 PLen, FTP_INFO *Fip);
static uint8 CmdRest(char *Parameter, uint8 PLen, FTP_INFO *Fip);
static uint8 CmdRnfr(char *Parameter, uint8 PLen, FTP_INFO *Fip);
static uint8 CmdRnto(char *Parameter, uint8 PLen, FTP_INFO *Fip);
static uint8 CmdAbor(char *Parameter, uint8 PLen, FTP_INFO *Fip);
static uint8 CmdDele(char *Parameter, uint8 PLen, FTP_INFO *Fip);
static uint8 CmdRmd(char *Parameter, uint8 PLen, FTP_INFO *Fip);
static uint8 CmdMkd(char *Parameter, uint8 PLen, FTP_INFO *Fip);
static uint8 CmdPwd(char *Parameter, uint8 PLen, FTP_INFO *Fip);
static uint8 CmdList(char *Parameter, uint8 PLen, FTP_INFO *Fip);
static uint8 CmdNlst(char *Parameter, uint8 PLen, FTP_INFO *Fip);
static uint8 CmdSite(char *Parameter, uint8 PLen, FTP_INFO *Fip);
static uint8 CmdSyst(char *Parameter, uint8 PLen, FTP_INFO *Fip);
static uint8 CmdStat(char *Parameter, uint8 PLen, FTP_INFO *Fip);
static uint8 Cmdhelp(char *Parameter, uint8 PLen, FTP_INFO *Fip);
static uint8 Cmdnoop(char *Parameter, uint8 PLen, FTP_INFO *Fip);

//*********************************************************************************************************

typedef struct 
{
    char *CmdName;
    uint8 (* Cmd)(char *Parameter, uint8 PLen, FTP_INFO *Fip);
}_FTP;

const static _FTP FtpCmdData[] = {
//访问控制命令
                    {"USER", CmdUser},
                            //用户名(USER);必须
                            //参数是标记用户的Telnet串。用户标记是访问服务器必须的,此命令通常
                            //是控制连接后第一个发出的命令,有些主机还会要求口令和帐户。服务器
                            //可以在任何时间接收新的USER命令以改变访问控制和(或)帐户信息。
                            //这可以重新开始登录过程,所以传输参数不变,在进行中的文件传输在过
                            //去的访问控制参数下完成。
                    {"PASS", CmdPass},
                            //口令(PASS)
                            //参数是标记用户口令的Telnet串。此命令紧跟USER命令,在某些站点它是
                            //完成访问控制不可缺少的一步。因此口令是个重要的东西,因此不能显示
                            //出来,服务器方没有办法隐藏口令,所以这一任务得由用户FTP进程完成。
                    {"ACCT", CmdAcct},
                            //认证 (ACCT)
                            //参数是标记用户帐户的Telnet串。此命令不需要与USER相关,一些站点可
                            //能需要帐户用于登录,另一些可以限制帐户的权限,在后一种情况下,此
                            //命令可在任何时候发送。应答的不同可以区别不同的情况:当登录需要帐
                            //户信息时,对PASS命令的响应是332。另外,如果不需要帐户信息,对PASS
                            //的响应是230,如果需要帐户信息在以后需要,服务器会返回332或532,
                            //这要看它是保存此命令还是拒绝此命令了。
                    {"CWD", CmdCwd},
                            //改变工作目录(CWD)
                            //此命令使用户可以在不同的目录或数据集下工作而不用改变它的登录或帐
                            //户信息。传输参数也不变。参数一般是目录名或与系统相关的文件集合。
                    {"CDUP", CmdCdup},
                            //回到上一层目录(CDUP)
                            //此命令要求系统实现目录树结构,它的响应和CWD的相同。
                    {"SMNT", CmdSmnt},
                            //结构加载(SMNT)
                            //此命令使用户在不改变登录或帐户信息的情况下加载另一个文件系统数据
                            //结构。传输参数也不变。参数是文件目录或与系统相关的文件集合。
                    {"REIN", CmdRein},
                            //重新初始化(REIN)
                            //此命令终止USER,将所有I/O和帐户信息写入,但不许进行中的数据传输
                            //完成。重置所有参数,控制连接打开,可以再次开始USER命令。
                    {"QUIT", CmdQuit},
                            //退出登录(QUIT);必须
                            //此命令终止USER,如果没有数据传输,服务器关闭控制连接;如果有数据
                            //传输,在得到传输响应后服务器关闭控制连接。如果用户进程正在向不同
                            //的USER传输数据,不希望对每个USER关闭然后再打开,可以使用REIN。对
                            //控制连接的意外关闭,可以导致服务器运行中止(ABOR)和退出登录(QUIT)。
                    
//传输参数命令
//所有数据传输参数有默认值。服务器必须记录下默认值,在FTP服务请求后,可以以任何顺序发送。
                    {"PORT", CmdPort},
                            //数据端口(PORT);必须
                            //参数是要使用的数据连接端口,通常情况下对此不需要命令响应。如果使
                            //用此命令时,要发送32位的IP地址和16位的TCP端口号。上面的信息以8位
                            //为一组,逗号间隔十进制传输,如下例:
                            //PORT h1,h2,h3,h4,p1,p2
                            //其中h1是IP地址的最高8位。
                    {"PASV", CmdPasv},
                            //被动(PASV)
                            //此命令要求服务器DTP在指定的数据端口侦听,进入被动接收请求的状态,
                            //参数是主机和端口地址。
                    {"TYPE", CmdType},
                            //表示类型(TYPE);必须
                            //参数指定表示类型。有些类型需要第二个参数,第一个参数由单个Telnet
                            //字符定义,第二个参数是十进制整数指定字节大小,参数间以<SP>分隔。
                            //下面是格式:(缺图)
                            //默认表示类型是ASCII非打印字符,如果参数未改变,以后只改变了第一个
                            //参数,则使用默认值。
                    {"STRU", CmdStru},
                            //文件结构(STRU)
                            //参数是一个Telnet字符代码指定文件结构。下面是代码及其意义:
                            //F - 文件(非记录结构),它是默认值
                            //R - 记录结构
                            //P - 页结构
                    {"MODE", CmdMode},
                            //传输模式(MODE);必须
                            //参数是一个Telnet字符代码指定传输模式。下面是代码及其意义:
                            //S - 流(默认值)
                            //B - 块
                            //C - 压缩
//FTP服务命令
//FTP服务命令定义用户请求的文件传输或文件系统功能。此命令的参数通常是路径名,其语法要和服务器的
//规范一致。推荐的默认值是最近指定的设备目录或目录。命令顺序通常没有限制,只有"rename from"命令
//后面必须是"rename to",重新启动命令后面必须是中断服务命令。服务命令的响应通常在数据连接上传输。                    
                    {"RETR", CmdRetr},
                            //获得文件(RETR);必须
                            //此命令使服务器DTP传送指定路径内的文件复本到服务器或用户DTP。这边服
                            //务器上文件的状态和内容不受影响。
                    {"STOR", CmdStor},
                            //保存(STOR);必须
                            //此命令使服务器DTP接收数据连接上传送过来的数据,并将数据保存在服务
                            //器的文件中。如果文件已存在,原文件将被覆盖。如果文件不存在,则新建
                            //文件。
                    {"STOU", CmdStou},
                            //唯一保存(STOU);必须
                            //此命令和STOR差不多,此命令要求在此目录下的文件名是唯一的,对此命令
                            //的响应必须包括产生的用户名。
                    {"APPE", CmdAppe},
                            //附加(APPE)
                            //它和STOR的功能差不多,但是如果文件在指定路径内已存在,则把数据附加
                            //到原文件尾部,如果不存在则新建文件。
                    {"ALLO", CmdAllo},
                            //分配(ALLO)
                            //此命令用于在一些主机上为新传送的文件分配足够的存储空间。参数是十进
                            //制的逻辑字节数。如果是记录或页结构,页或记录的最大大小也需要,这在
                            //第二个参数内以十进制指定。第二个参数是可选的,如果有它,它和第一个
                            //参数以Telnet字符<SP> R <SP>分隔。此命令在STOR或APPE命令后,对于不
                            //需要分配存储空间的机器,它的作用等于NOOP。
                    {"REST", CmdRest},
                            //重新开始(REST)
                            //参数域代表服务器要重新开始的那一点,此命令并不传送文件,而是略过指
                            //定点后的数据,此命令后应该跟其它要求文件传输的FTP命令。
                    {"RNFR", CmdRnfr},
                            //重命名(RNFR)
                            //这个命令和我们在其它操作系统中使用的一样,只不过后面要跟"rename to"
                            //指定新的文件名。
                    {"RNTO", CmdRnto},
                            //重命名为(RNTO)
                            //此命令和上面的命令共同完成对文件的重命名。
                    {"ABOR", CmdAbor},
                            //放弃(ABOR)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -