diff --git a/APP_Framework/Applications/app_test/Makefile b/APP_Framework/Applications/app_test/Makefile index 6b0c1ea96..6c34b33e2 100644 --- a/APP_Framework/Applications/app_test/Makefile +++ b/APP_Framework/Applications/app_test/Makefile @@ -134,7 +134,7 @@ ifeq ($(CONFIG_ADD_XIZI_FEATURES),y) endif ifeq ($(CONFIG_USER_TEST_FTPCLIENT),y) - SRC_FILES += + SRC_FILES += test_ftpclient_final/test_ftpclient_final.c test_ftpclient_final/ftp_client/ftp_client.c test_ftpclient_final/ftp_client/my_socket.c endif ifeq ($(CONFIG_USER_TEST_LORA_P2P),y) diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/README.md b/APP_Framework/Applications/app_test/test_ftpclient_final/README.md new file mode 100644 index 000000000..d9dc354cd --- /dev/null +++ b/APP_Framework/Applications/app_test/test_ftpclient_final/README.md @@ -0,0 +1,84 @@ +# 决赛一级赛题3:基于初赛一级赛题3,在云服务器上实现FTP Server功能 + +## 1. 简介 +本项目是基于赛事提供的云服务器,实现FTP协议的Server功能,其功能支持至少10个Client端并发向Server端传输4KB大小的文件, +支持Server端并发地向至少10个Client端传输4KB大小的文件。 +test_ftpclient_final.h声明了多个客户端并发下载文件的测试函数 +test_ftpclient_final.c实现了多个客户端并发下载文件的测试函数 +ftp_client文件夹定义了ftp_client的相关类库其中my_socket.h,my_socket.c定义了socket抽象层,并基于 +Lwip实现了该抽象层,ftp_client.h,ftp_client.c实现了ftp登录,获取文件大小,下载文件等功能 +注意:在赛事提供的云服务器/root/yanglongFTP上有对应服务器代码 ./server运行服务器 +## 2. 数据结构设计说明 +- ftp_client.c 的设计 +分别定义了发送命令和接收数据的socket和相应的缓冲区并且实现了登录、发送命令、接收响应数据、查找文件大小、进入被动模式、下载文件、关闭ftp客户端等操作 +```c +static int m_socket_cmd[THREAD_NUM]; // 发送命令的socket文件描述符,THREAD_NUM表示线程数目,用来模拟多个客户端并发访问 +static int m_socket_data[THREAD_NUM]; // 接收ftp服务器文件的socket文件描述符 +static char m_send_buffer[THREAD_NUM][1024]; // 发送缓冲区 +static char m_recv_buffer[THREAD_NUM][1024]; // 接收缓冲区 +``` +- server.c 的设计(具体代码在赛事提供的云服务器的/root/yanglongFTP下) +```c +#define THREAD_NUM 10 // 可接受的客户端数目 +static int isBinary = 0; // 是否是二进制传输文件 +static int port = 9992; // 命令服务器端口 +static int dataPort = 9993; // 文件传输服务器端口 +static char order[4]; // 存储命令 +static char param[20]; // 存储命令参数 +static char *respMessage; // 响应消息指针 +static int serverFd; // 命令服务器的socket fd +static int dataServerFd; // 文件传输服务器的 socket fd +struct Data{ // 用于线程间通信 + sem_t isReady; // 命令服务器是否收到并写好文件名 + sem_t isDone; // 文件传输服务器是否传输完文件 + char fileName[20]; // 存储文件名 +}; +``` +## 3. 测试程序说明 +- test_ftpclient_final.c用于测试多个客户端并发下载文件 +通过多线程模拟多个客户端并发访问服务器 +```c +/* test for 10 ftp client */ +void TestFtpClient(int argc, char* argv[]) +{ + int n = atoi(argv[1]); + for(int i = 0;i < n;++i){ + threadIDs[i] = i; + pthread_create(NULL,NULL,&downLoad,&threadIDs[i]); + } + return; +} +PRIV_SHELL_CMD_FUNCTION(TestFtpClient, a ftpClient test sample, PRIV_SHELL_CMD_MAIN_ATTR); +``` + +## 4. 运行结果(##需结合运行测试截图按步骤说明##) +1. 配置开启BSP_USING_LWIP、USER_TEST_FTPCLIENT +![](./img/image.png) +![](./img/image-1.png) +![](./img/image-2.png) +2. 编译 +![](./img/image-3.png) +3. 烧写 +![](./img/image-4.png) +4. xshell连接串口终端并配置ip +![](./img/image-5.png) +5. 通过./server在云服务器运行FTP服务器 +![](./img/image-6.png) +6. 运行TestFtpClient 10,模拟10个客户端并发下载文件 +- 客户端日志 +![](./img/image-7.png) +![](./img/image-8.png) +![](./img/image-9.png) +![](./img/image-10.png) +![](./img/image-11.png) +![](./img/image-12.png) +![](./img/image-13.png) +![](./img/image-14.png) +![](./img/image-15.png) +![](./img/image-16.png) +- 服务器日志 +![](./img/image-17.png) +![](./img/image-18.png) +![](./img/image-19.png) +![](./img/image-20.png) +![](./img/image-21.png) \ No newline at end of file diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_client/ftp_client.c b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_client/ftp_client.c new file mode 100644 index 000000000..aa4574dee --- /dev/null +++ b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_client/ftp_client.c @@ -0,0 +1,253 @@ +/* +* Copyright (c) 2020 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/** +* @file: ftp_client.c +* @brief: ftp client tool +* @version: 1.0 +* @author: bdislab_final +* @date: 2023/9/16 +*/ + +#include +#include +#include +#include +#include "my_socket.h" +#include "ftp_client.h" + + +static int m_socket_cmd[THREAD_NUM]; +static int m_socket_data[THREAD_NUM]; +static char m_send_buffer[THREAD_NUM][1024]; +static char m_recv_buffer[THREAD_NUM][1024]; + +static int FtpSendCommand(int threadID,char *cmd) +{ + int ret; + printf("send command: %s,threadID=%d\r\n", cmd,threadID); + ret = SocketSend(m_socket_cmd[threadID], cmd, (int)strlen(cmd)); + if(ret < 0) + { + printf("failed to send command: %s\r\n",cmd); + return 0; + } + return 1; +} + +static int FtpRecvRespond(int threadID,char *resp, int len) +{ + int ret; + int off; + len -= 1; + for(off=0; off +#include +#include +#include + +int SocketCreate(void){ + return socket(AF_INET,SOCK_STREAM,0); +} + +int SocketConnect(int sock, const char *addr, int port){ + // unsigned int iRemoteAddr = 0; + struct sockaddr_in stRemoteAddr = {0}; //对端,即目标地址信息 + + stRemoteAddr.sin_family = AF_INET; + stRemoteAddr.sin_port = htons(port); + stRemoteAddr.sin_addr.s_addr = inet_addr(addr); + int res = connect(sock,(struct sockaddr *)&stRemoteAddr,sizeof(stRemoteAddr)); + if(res == -1){ + printf("error:%d,str error:%s\n",errno,strerror(errno)); + } + return res == 0 ? 1 : 0; +} + +int SocketSend(int sock, void *data, int len){ + return send(sock,data,len,0); +} + +int SocketRecv(int sock, void *data, int len){ + return recv(sock,data,len,0); +} + +void SocketClose(int sock){ + close(sock); +} diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_client/my_socket.h b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_client/my_socket.h new file mode 100644 index 000000000..19854f55e --- /dev/null +++ b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_client/my_socket.h @@ -0,0 +1,46 @@ +/* +* Copyright (c) 2020 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/** + * @file my_socket.h + * @brief a abstract socket api + * @version 1.0 + * @author bdislab_final + * @date 2023/9/16 + */ + +#ifndef MYSOCKET_H +#define MYSOCKET_H + +#ifdef __cplusplus +extern "C" { +#endif +/* create a socket */ +int SocketCreate(void); + +/* connect a socket */ +int SocketConnect(int sock, const char *addr, int port); + +/* send data through socket*/ +int SocketSend(int sock, void *data, int len); + +/* receive data from socket*/ +int SocketRecv(int sock, void *data, int len); + +/* close socket*/ +void SocketClose(int sock); + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-1.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-1.png new file mode 100644 index 000000000..61d2c21d7 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-1.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-10.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-10.png new file mode 100644 index 000000000..a1f0f4966 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-10.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-11.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-11.png new file mode 100644 index 000000000..ea40d9457 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-11.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-12.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-12.png new file mode 100644 index 000000000..dca42550d Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-12.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-13.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-13.png new file mode 100644 index 000000000..41e2f35a7 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-13.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-14.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-14.png new file mode 100644 index 000000000..9b70c95c9 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-14.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-15.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-15.png new file mode 100644 index 000000000..dc979f115 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-15.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-16.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-16.png new file mode 100644 index 000000000..dd4f08a58 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-16.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-17.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-17.png new file mode 100644 index 000000000..1a95ff84c Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-17.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-18.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-18.png new file mode 100644 index 000000000..c6cc1296d Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-18.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-19.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-19.png new file mode 100644 index 000000000..d3aa14dfb Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-19.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-2.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-2.png new file mode 100644 index 000000000..35ea476c9 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-2.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-20.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-20.png new file mode 100644 index 000000000..3a881cfc6 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-20.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-21.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-21.png new file mode 100644 index 000000000..f5eb00ea4 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-21.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-3.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-3.png new file mode 100644 index 000000000..1245e6843 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-3.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-4.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-4.png new file mode 100644 index 000000000..a8e31410a Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-4.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-5.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-5.png new file mode 100644 index 000000000..3b1130a3e Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-5.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-6.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-6.png new file mode 100644 index 000000000..531ccc29b Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-6.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-7.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-7.png new file mode 100644 index 000000000..bf0d48630 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-7.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-8.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-8.png new file mode 100644 index 000000000..c88f44e85 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-8.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-9.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-9.png new file mode 100644 index 000000000..db34576c5 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-9.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image.png new file mode 100644 index 000000000..516c58f46 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/test_ftpclient_final.c b/APP_Framework/Applications/app_test/test_ftpclient_final/test_ftpclient_final.c new file mode 100644 index 000000000..80bb0f010 --- /dev/null +++ b/APP_Framework/Applications/app_test/test_ftpclient_final/test_ftpclient_final.c @@ -0,0 +1,63 @@ +/* +* Copyright (c) 2020 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/** +* @file: test_ftpclient.c +* @brief: a ftpClient test sample +* @version: 1.0 +* @author: bdislab_final +* @date: 2023/9/16 +*/ + +#include "test_ftpclient_final.h" +#include "ftp_client/ftp_client.h" +#include +#include +#include +#include +#include + +int threadIDs[THREAD_NUM]; + +void delay(int n){ + for(int i = 0;i < n;++i); +} +/*one client downLoad a file of 4K*/ +void* downLoad(void* arg){ + int *pThreadID = (int*)arg; + printf("in thread:tid=%ld\n", pthread_self()); + FtpInitCmd(*pThreadID); + int ret = FtpLogin(*pThreadID,"8.140.53.225", 9992, "anonymous", "anonymous"); + int size; + char *buf; + char fileName[20] = "/file1"; + size = FtpFileSize(*pThreadID,fileName); + buf = malloc(size); + FtpInitData(*pThreadID); // data socket 每次下载都要重新创建,下载完都要关闭 + delay(1000); + ret = FtpDownload(*pThreadID,fileName, buf, size); + free(buf); + FtpQuit(*pThreadID); + return NULL; +} + +/* test for 10 ftp client */ +void TestFtpClient(int argc, char* argv[]) +{ + int n = atoi(argv[1]); + for(int i = 0;i < n;++i){ + threadIDs[i] = i; + pthread_create(NULL,NULL,&downLoad,&threadIDs[i]); + } + return; +} +PRIV_SHELL_CMD_FUNCTION(TestFtpClient, a ftpClient test sample, PRIV_SHELL_CMD_MAIN_ATTR); diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/test_ftpclient_final.h b/APP_Framework/Applications/app_test/test_ftpclient_final/test_ftpclient_final.h new file mode 100644 index 000000000..cc6820ea4 --- /dev/null +++ b/APP_Framework/Applications/app_test/test_ftpclient_final/test_ftpclient_final.h @@ -0,0 +1,37 @@ +/* +* Copyright (c) 2020 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/** + * @file test_ftpclient.h + * @brief a ftpClient test sample + * @version 1.0 + * @author bdislab_final + * @date 2023/9/16 + */ + +#ifndef TEST_FTPCLIENT_H +#define TEST_FTPCLIENT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*one client downLoad 10 files of 4K*/ +void* downLoad(void* arg); +/* test for ftp client */ +void TestFtpClient(int argc, char* argv[]); + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file