首页 > 其他分享 >CH395实现FTP_Client应用(上)

CH395实现FTP_Client应用(上)

时间:2024-03-13 10:13:01浏览次数:28  
标签:FTP ftp CH395 Client txt recv buff

测试环境:CH30v307RCT6 + CH395Q,PC端工具:XLight (FTP服务器,语言为英文)

1.主要代码说明

(1)main.c

(2)CH395FTP.c

工程CH395FTP.c 99行 CH395_FTPInterCmd函数执行了四个主要的流程,包括登录、搜索目录、下载文件、上传文件。在该函数中可以修改想要访问的文件夹和文本文档名称,也可修改想要上传的文件夹及文本文档名称。(主要要和之后FTP服务器中的主目录设置保持一致)。

 1 /*******************************************************************************
 2 * Function Name  : CH395_FTPInterCmd
 3 * Description    : 执行对应的命令,可自行调整执行顺序
 4 * Input          : NONE
 5 * Output         : None
 6 * Return         : None
 7 *******************************************************************************/
 8 void CH395_FTPInterCmd( )
 9 {
10     switch(ftp.FileCmd){
11         case FTP_CMD_LOGIN:                                                            /* 登陆      */
12             if( CH395_FTPLogin( ) == FTP_COMMAND_SUCCESS ){                            /* 登陆成功,可进行其他操作*/
13                 CH395_FTPSearch("USER","FILELIST.txt" );                               /* 开始查询指定的目录下的文件*/
14                 printf("进入目录\r\n");
15             }
16             break;
17         case FTP_CMD_SEARCH:                                                           /* 搜查文件(参数:目录名,文件名)*/
18             if( CH395_FTPSearch("USER","FILELIST.txt" ) == FTP_COMMAND_SUCCESS ){      /* 查询命令执行完毕,可进行其他操作 */
19 //                printf("进入目录1\r\n");
20                 if( ftp.FindFile )CH395_FTPGetFile("FILELIST.txt" );                   /* 搜查到指定的目录下的文件则开始下载文件 */
21                 else CH395_FTPQuit( );                                                 /* 没搜查到指定的目录下的文件则退出(也可进行其他操作,如上传)*/
22             }
23             break;
24         case FTP_CMD_GETFILE:                                                          /* 下载文件(参数:文件名)*/
25             if(CH395_FTPGetFile("FILELIST.txt" ) == FTP_COMMAND_SUCCESS ){             /* 下载文件成功,可进行其他操作    */
26                 CH395_FTPPutFile("TEXT","abc.txt");                                    /* 上传文件      */
27             }
28             break;
29         case FTP_CMD_PUTFILE:                                                          /* 上传文件(参数:目录名,文件名)*/
30             if( CH395_FTPPutFile("TEXT","abc.txt")== FTP_COMMAND_SUCCESS ){            /* 上传文件成功,可进行其他操作*/
31                 CH395_FTPQuit( );                                                      /* 退出    */
32             }
33             break;
34         default:
35             break;
36     }
37 }

(3)CH395FTPCMD.c

该.c文件主要是对FTP协议相关命令码和应答的封装和处理。

下面一段代码是在工程CH395FTPCMD.c中的342行,要注意的点是有些FTP服务器使用的FTP协议版本不同或工具语言不同,会导致395对其发出的应答码解析错误。

例如:当Xlight语言选择中文时,发出的应答就是"200 类型....",这就和下面代码中的"200 Type'对不上了,就会导致解析错误以至于FTP传输卡住。

    如果出现这种情况,建议打印一下recv_buff看一下具体的应答是否和代码一致,再做具体修改。

 1 /********************************************************************************
 2 * Function Name  : CH395_FTPCheckSearch
 3 * Description    : 验证搜查文件握手信号
 4 * Input          : recv_buff- 握手信息
 5                    check_type-检测的类型
 6 * Output         : None
 7 * Return         : None
 8 *********************************************************************************/
 9 UINT8 CH395_FTPCheckSearch( char *recv_buff )
10 {
11     printf("#####");
12 
13   if( strncmp("200 Type", recv_buff, 8) == 0 ){                                           /* 格式类型*/
14     CH395_FTPDatServer( 1,&ftp.SouPort );
15     CH395_FTPPort( ftp.SouPort );
16   }
17   else if( strncmp("200 PORT", recv_buff, 8 ) == 0){
18     CH395_FTPList( );
19   }
20   else if( strncmp("150", recv_buff, 3) == 0 ){                                           /* 获取列表成功*/
21     ftp.CmdDataS = FTP_MACH_RECEDATA;
22   }
23   else if( strncmp("226", recv_buff, 3) == 0 ){                                           /* 列表信息结束*/
24     if(ftp.InterCmdS == FTP_MACH_FINDFILE) ftp.CmdStatus = FTP_MACH_SEARCHSUC;
25      if(ftp.FindList == 1){
26          ftp.FindList = 0;
27          CH395_FTPCwd( 0 );
28      }
29     ftp.InterCmdS = 0;
30   }
31   else if( strncmp("425", recv_buff, 3) == 0 ){                                           /* 无法建立数据连接*/
32     CH395_FTPQuit( );
33   }                              
34   else if( strncmp("250", recv_buff, 3) == 0 ){                                           /* 打开目录*/
35      printf("250^^^^^^^^^^^^^^^^^^^^^^^^^^");
36    ftp.InterCmdS = FTP_MACH_FINDFILE;
37     CH395_FTPType( );
38   }
39   else if( strncmp("221", recv_buff, 3) == 0 ){                                           /* 退出登陆  */
40     CH395CloseSocket( ftp.SocketCtl );                                                    /* 关闭连接  */
41   }
42   else return FTP_ERR_SEARCH;
43   return FTP_CHECK_SUCCESS;
44 }

(4)CH395FTPFILE.c

通过修改pTest中的内容,可以修改上传文档的内容。

 1 const  UINT8 *pTest = "abcdefghijklmnopqrstuvwxyz0123456789";     /* 上传文档的内容 */
 2 /*********************************************************************************
 3 * Function Name  : CH395_FTPFileRead
 4 * Description    : 传送数据   
 5 * Input          : None
 6 * Output         : None                  
 7 * Return         : None
 8 *********************************************************************************/
 9 void CH395_FTPFileRead( )
10 {
11      memset( send_buff, '\0', sizeof(send_buff));
12      if(strlen(pTest)<536) {
13           sprintf( send_buff, "%s\r\n",pTest);                  /*将数据写入发送缓冲区,如数据较大,分多次写入 */
14           ftp.CmdDataS = FTP_MACH_DATAOVER;                     /*如果数据读完则置为数据读完标志位 */
15      }
16 }

2.例程演示

(1)在PC机上创建一个名为USER的文件夹,然后在里面再创建一个名为USER的文件夹,在USER文件夹中创建 FILELIST.txt 。打开这个文本文档,在里面随便写一些内容。(文件的名称和代码中一致)

(2)下载XLight后(注意语言版本,选择英文版),点击,选择和395连接的网卡的IP,端口选择21,协议选择FTP,点击确定。

(3)双击所创建的FTP服务器,选择左侧列表中的Public Patch,点击右侧的"+",将Permission下的权限都勾选上,然后点击Browse选择目录,即选择第一步所创建的文件夹,注意选择到第一个USER(如图)。最后点击下面的确定。

(4)选中所创建的FTP服务器,点击上方的,之后再点击,创建用户名和登录密码(注意和代码保持一致),之后点击Browse选择主目录(和上一步一样),最后点击,将其中的权限都勾选上。

 (5)烧录代码运行后,能看到成功通过FTP协议读取到了FILELIST.txt文本文档中的内容,并且成功在USER文件夹下创建了一个TEXT文件夹,里面有名为abc.txt的文本文档,其中的内容即代码所设置的需要上传的内容。


 

关于整个下载和上传的例程流程抓包和打印的解析可以看这篇博客,可在链接中下载对应代码和日志。

CH395实现FTP_Client应用(下) - lqlq123 - 博客园 (cnblogs.com)

 

参考例程:https://files.cnblogs.com/files/blogs/808422/CH395_FTP.zip?t=1710226512&download=true

抓包及log打印:https://files.cnblogs.com/files/blogs/808422/FTP_client_%E6%8A%93%E5%8C%85%E5%8F%8Alog%E6%89%93%E5%8D%B0.zip?t=1710226723&download=true

标签:FTP,ftp,CH395,Client,txt,recv,buff
From: https://www.cnblogs.com/wchwchlq/p/18067696

相关文章

  • CH395实现FTP_Client应用(下)
    CH395实现FTP_Client例程、抓包和打印log可以在下面的博客中下载CH395实现FTP_Client应用(上)-lqlq123-博客园(cnblogs.com) 本篇是对例程流程抓包和打印日志的解析1.串口打印日志(从上电到流程结束):1SourIP:192,168,3,30,//本地IP2......
  • client-go使用技巧
    Pod使用集群kubeconfigimport"k8s.io/client-go/rest"cfg,err:=rest.InClusterConfig()iferr!=nil{ klog.Fatalf("Errorbuildingkubeconfig:%s",err.Error())}list/watch指定namespaceinformerFactory:=informers.NewSharedInformerFacto......
  • SFTP子系统申请已拒绝, 请确保SSH连接的SFTP子系统设置有效
    一、报错信息报错:SFTP子系统申请已拒绝请确保SSH连接的SFTP子系统设置有效二、错误原因是ssh配置做了限制,修改一下配置文件就好了。三、解决方式修改 sshd_config 配置文件。vim/etc/ssh/sshd_config如果配置文件中不存在以下代码,找个位置添加上即可。Subsystem......
  • 验证码绕过(on client)
    右键查看源码找到关键性代码:验证码生成代码分析得知,这段代码是一个JavaScript函数createCode(),它用于生成验证码并将生成的验证码设置为具有特定ID("checkCode")的HTML元素的值将验证码生成写在前端上是容易绕过的输入正确验证码后抓包sendtointruder,将验证码参数去......
  • 利用JavaRestClient依赖使用java操作索引库
    引入依赖<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.12.1</version></depend......
  • sftp 增加用户链接以及配置当中出现的问题(跳板机)
    1.增加用户useraddusersftppasswdusersftpchmod777/home/usersftp2.配置vim/etc/ssh/sshd_config2.1将注释掉2.2增加Subsystemsftpinternal-sftpMatchUserusersftp 3.连接sftp[-oPort=21]username@ip然后再输入密码即可(如果出现跳板机能......
  • centos7安装sftp
    FTP明文传输,SFTP传输加密后更加的可靠,所以选择sftp1、ssh-V命令来查看openssh的版本版本必须大于4.8p1低于的这个版本需要升级升级的话可以在网上找下输入ssh-V  2、创建SFTP相关用户及目录 2.1创建一个系统用户,并设置成不能登录,按需设置登录的shell和家目录use......
  • 使用威联通做UPS server(NUT) 配置 linux和windows的 UPS client
     NetworkUPSTools(NUT)威联通设置1️⃣威联通使用usb线接入UPS2️⃣在设置中勾选“启用网络不间断服务器”,启用UPS服务器3️⃣把需要连入的设备IP加到列表里如下图所示配置linux以Ubuntu为例,其他使用NUT自行安装1️⃣安装NUTaptinstallnut#启动NUT生成默认......
  • 传统FTP传输存在哪些局限性?如何进行FTP替代?
    说到文件传输产品,很多人第一反应都是FTP,FTP是一种通用的文件传输协议,在各种操作系统和网络环境下都得到广泛支持,使用方便,确实在文件传输领域风靡了很多年,但随着互联网技术的发展和企业数字化需求的提升,其局限性也逐渐显现,所以很多企业都在寻找FTP替代的办法。那么传统FTP究竟有哪......
  • HttpClientHandler VS SocketsHttpHandler
    .NETFramework和.NETCore2.0及更低版本中由HttpClient使用的默认消息处理程序为HttpClientHandler。从.NETCore2.1开始,类SocketsHttpHandler提供了更高级别的HTTP网络类(例如HttpClient)使用的实现。使用SocketsHttpHandler提供了许多优点:与之前的实施相比,性能......