diff --git a/APP_Framework/Applications/app_test/Makefile b/APP_Framework/Applications/app_test/Makefile index 43cd4364f..57f7b1e87 100644 --- a/APP_Framework/Applications/app_test/Makefile +++ b/APP_Framework/Applications/app_test/Makefile @@ -157,7 +157,11 @@ ifeq ($(CONFIG_ADD_XIZI_FEATURES),y) ifeq ($(CONFIG_USER_TEST_USB_CAMERA),y) SRC_FILES += - endif + endif + + ifeq ($(CONFIG_USER_TEST_FTPCLIENT_FINAL),y) + 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 include $(KERNEL_ROOT)/compiler.mk endif 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..2e691ad00 --- /dev/null +++ b/APP_Framework/Applications/app_test/test_ftpclient_final/README.md @@ -0,0 +1,135 @@ +# 决赛一级赛题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运行服务器,为了方便查看代码我们讲服务器代码备份存放在ftp_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 10000 // thread num +static int isBinary = 0; // transmit binary data +static int port = 9992; // service port +static int dataPort = 9993; // the port for file download +static char order[4]; // receive order +static char param[20]; // receive order param +static char *respMessage; // respose message +static int serverFd; // the server fd for deal with order requests +static int dataServerFd; // the server fd for file download +sem_t mutex; // mutex lock +struct Data{ // 线程间通信传输的数据 + char fileName[20]; // file name + int type; // 0:download 1:upload + sem_t isDone; // complete file downlaod + sem_t isReady; // 文件准备好了 +} data; +``` +## 3. 测试程序说明 +- test_ftpclient_final.c用于测试多个客户端并发下载文件 +通过多线程模拟多个客户端并发访问服务器,通过 TestFtpClient options threads进行测试 +其中options=1表示下载options=2表示上传,threads表示线程数/模拟的并发客户端数目 +```c +/* test for 10 ftp client */ +void TestFtpClient(int argc, char* argv[]) +{ + int options = atoi(argv[1]); + int n = atoi(argv[2]); + pthread_t threads[THREAD_NUM]; + for(int i = 0;i < n;++i){ + threadIDs[i] = i; + if(options == 1){ // 全部都是下载 + pthread_create(&threads[i],NULL,&DownLoad,&threadIDs[i]); + }else if(options == 2){ // 全部都是上传 + pthread_create(&threads[i],NULL,&UpLoad,&threadIDs[i]); + }else if(options == 3){ // 随机下载/上传 + int r = rand()%2; + if(r == 0){ + printf("===============download===============\n"); + pthread_create(&threads[i],NULL,&DownLoad,&threadIDs[i]); + }else{ + printf("===============upload===============\n"); + pthread_create(&threads[i],NULL,&UpLoad,&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 1 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) +7. 运行TestFtpClient 2 10,模拟10个客户端并发上传文件 +- 客户端日志 +![](./img/image-22.png) +![](./img/image-23.png) +![](./img/image-24.png) +![](./img/image-25.png) +![](./img/image-26.png) +![](./img/image-27.png) +![](./img/image-28.png) +- 服务器日志 +![](./img/image-29.png) +![](./img/image-30.png) +![](./img/image-31.png) +![](./img/image-32.png) +- 上传结果 +![](./img/image-33.png) +8. 运行TestFtpClient 3 10,模拟10个客户端混合并发下载和上传文件 +- 客户端日志 +![](./img/image-34.png) +![](./img/image-35.png) +![](./img/image-36.png) +![](./img/image-37.png) +![](./img/image-38.png) +![](./img/image-39.png) + +- 服务器日志 +![](./img/image-40.png) +![](./img/image-41.png) +![](./img/image-42.png) + +- 下载和上传结果 +![](./img/image-43.png) +![](./img/image-44.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..4e1cb554f --- /dev/null +++ b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_client/ftp_client.c @@ -0,0 +1,299 @@ +/* +* 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/ftp_server/a.out b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/a.out new file mode 100755 index 000000000..7e9454464 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/a.out differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/data/file1 b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/data/file1 new file mode 100644 index 000000000..08e7df176 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/data/file1 differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/data/file10 b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/data/file10 new file mode 100644 index 000000000..08e7df176 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/data/file10 differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/data/file2 b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/data/file2 new file mode 100644 index 000000000..08e7df176 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/data/file2 differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/data/file3 b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/data/file3 new file mode 100644 index 000000000..08e7df176 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/data/file3 differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/data/file4 b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/data/file4 new file mode 100644 index 000000000..08e7df176 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/data/file4 differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/data/file5 b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/data/file5 new file mode 100644 index 000000000..08e7df176 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/data/file5 differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/data/file6 b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/data/file6 new file mode 100644 index 000000000..08e7df176 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/data/file6 differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/data/file7 b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/data/file7 new file mode 100644 index 000000000..08e7df176 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/data/file7 differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/data/file8 b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/data/file8 new file mode 100644 index 000000000..08e7df176 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/data/file8 differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/data/file9 b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/data/file9 new file mode 100644 index 000000000..08e7df176 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/data/file9 differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/data/gen.sh b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/data/gen.sh new file mode 100644 index 000000000..7382342b3 --- /dev/null +++ b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/data/gen.sh @@ -0,0 +1,5 @@ +#!/bin/bash +for i in {1..10} +do + dd if=/dev/zero of="file$i" bs=4K count=1 +done diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/out/file0 b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/out/file0 new file mode 100644 index 000000000..8486a6b13 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/out/file0 differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/out/file1 b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/out/file1 new file mode 100644 index 000000000..b70b444a1 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/out/file1 differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/out/file2 b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/out/file2 new file mode 100644 index 000000000..a18027c49 --- /dev/null +++ b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/out/file2 @@ -0,0 +1 @@ +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 \ No newline at end of file diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/out/file3 b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/out/file3 new file mode 100644 index 000000000..b70b444a1 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/out/file3 differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/out/file4 b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/out/file4 new file mode 100644 index 000000000..b70b444a1 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/out/file4 differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/out/file5 b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/out/file5 new file mode 100644 index 000000000..b70b444a1 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/out/file5 differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/out/file6 b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/out/file6 new file mode 100644 index 000000000..b70b444a1 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/out/file6 differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/out/file7 b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/out/file7 new file mode 100644 index 000000000..b70b444a1 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/out/file7 differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/out/file8 b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/out/file8 new file mode 100644 index 000000000..b70b444a1 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/out/file8 differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/out/file9 b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/out/file9 new file mode 100644 index 000000000..6fc16fe2c Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/out/file9 differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/server b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/server new file mode 100755 index 000000000..5a76806a4 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/server differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/server.c b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/server.c new file mode 100644 index 000000000..14000941a --- /dev/null +++ b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_server/server.c @@ -0,0 +1,251 @@ +/* +* 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: server.c +* @brief: a ftpserver +* @version: 1.0 +* @author: bdislab_final +* @date: 2023/10/11 +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define THREAD_NUM 10000 // thread num +static int isBinary = 0; // transmit binary data +static int port = 9992; // service port +static int dataPort = 9993; // the port for file download +static char order[4]; // receive order +static char param[20]; // receive order param +static char *respMessage; // respose message +static int serverFd; // the server fd for deal with order requests +static int dataServerFd; // the server fd for file download +sem_t mutex; // mutex lock +struct Data{ // 线程间通信传输的数据 + char fileName[20]; // file name + int type; // 0:download 1:upload + sem_t isDone; // complete file downlaod + sem_t isReady; // 文件准备好了 +} data; + +void RecvData(int clientFd,char param[20]){ + recv(clientFd,param,20,0); + for(int i = 0;i < 20;++i){ + if(param[i] == '\r'){ + param[i] = '\0'; + return; + } + } + return; +} + +void SendMessage(int clientFd, char * respMessage){ + int len = 0; + while(respMessage[len] != '\n'){ + len++; + } + send(clientFd,respMessage,len+1,0); +} + +int CreateServer(int port,int type) { + int serverFd = 0; + struct sockaddr_in serverAddr = {0}; + socklen_t socklen = 0; + serverFd = socket(AF_INET, SOCK_STREAM, 0); + if(0 > serverFd) + { + printf("创建socket失败\n"); + return 0; + } + + if(type == 0){ + printf("in ftp server:serverFd=%d\n",serverFd); + }else{ + printf("in ftp data server:serverFd=%d\n",serverFd); + } + serverAddr.sin_family = AF_INET; + serverAddr.sin_port = htons(port); + serverAddr.sin_addr.s_addr=htonl(INADDR_ANY); + if(0 > bind(serverFd, (void *)&serverAddr, sizeof(serverAddr))) + { + printf("绑定失败!\n"); + return 0; + } + if(0 > listen(serverFd, 1024)) + { + printf("监听失败!\n"); + return 0; + } + return serverFd; +} + +// receive file's data +void* UpLoadServer(void * args){ + int clientFd = *(int *) args; + char buf[4096]; + int ret = recv(clientFd,buf,4096,0); + printf("ret=%d,errno=%d\n",ret,errno); + FILE * file = fopen(data.fileName,"wb"); + fwrite(buf,4096,1,file); + fclose(file); + printf("upload complete for client: clientFd=%d,tid=%ld\n",clientFd,pthread_self()); + // notify for file download complete + sem_post(&data.isDone); + close(clientFd); +} + +// send file's data +void* DownLoadServer(void * args){ + int clientFd = *(int *) args; + char buf[4096]; + FILE * file = fopen(data.fileName,"rb"); + fread(buf,4096,1,file); + send(clientFd,buf,sizeof(buf),0); + fclose(file); + printf("download complete for client: clientFd=%d,tid=%ld\n",clientFd,pthread_self()); + // notify for file download complete + sem_post(&data.isDone); + close(clientFd); +} + +// accept a client and new a thread for downlaod/upload +void* DataServer(void * args){ + dataServerFd = CreateServer(dataPort,1); + while(1){ + // wait for a filename + sem_wait(&data.isReady); + struct sockaddr_in clientAdrr = {0}; + int socketLen = sizeof(clientAdrr); + int clientFd = accept(dataServerFd,(struct sockaddr *)&clientAdrr,&socketLen); + pthread_t thread; + if(data.type == 0){ // download + printf("accept a client for file download: clientFd=%d,tid=%ld\n",clientFd,pthread_self()); + pthread_create(&thread,NULL,&DownLoadServer,&clientFd); + }else if(data.type == 1){ // upload + printf("accept a client for file upload: clientFd=%d,tid=%ld\n",clientFd,pthread_self()); + pthread_create(&thread,NULL,&UpLoadServer,&clientFd); + } + // release lock + sem_post(&mutex); + } +} + +// deal with order requests +void* OrderServer(void * args){ + int clientFd = *(int *)args; + printf("in OrderServer thread: tid=%ld\n",pthread_self()); + // order format: USER anonymous\r\n + // response code format: 213 4096\r\n + while(1){ + recv(clientFd,order,4,0); + printf("order=%s,tid=%ld\n",order,pthread_self()); + if(strcmp(order,"USER") == 0){ + RecvData(clientFd,param); + if(strcmp(param," anonymous") == 0){ + respMessage = "331 Please specify the password.\r\n"; + SendMessage(clientFd,respMessage); + } + }else if(strcmp(order,"PASS") == 0){ + RecvData(clientFd,param); + if(strcmp(param," anonymous") == 0){ + respMessage = "230 Login successful.\r\n"; + SendMessage(clientFd,respMessage); + printf("login successful in clientFd %d,tid=%ld\n",clientFd,pthread_self()); + } + }else if(strcmp(order,"TYPE") == 0){ + RecvData(clientFd,param); + if(strcmp(param," I") == 0){ + isBinary = 1; + respMessage = "200 Switching to Binary mode.\r\n"; + SendMessage(clientFd,respMessage); + } + }else if(strcmp(order,"SIZE") == 0){ + RecvData(clientFd,param); + respMessage = "213 4096\r\n"; + SendMessage(clientFd,respMessage); + }else if(strcmp(order,"PASV") == 0){ + sem_wait(&mutex); // 锁竞争 + sem_init(&data.isDone,0,0); + RecvData(clientFd,param); + char buf[50]; + sprintf(buf,"227 Entering passive mode (8,140,53,225,%d,%d).\r\n",dataPort/256,dataPort%256); + respMessage = buf; + SendMessage(clientFd,respMessage); + }else if(strcmp(order,"RETR") == 0){ + RecvData(clientFd,param); + sprintf(data.fileName,"./data/%s",param+2); + data.type = 0; + // notify the thread of waiting fileName + sem_post(&data.isReady); + char buf[70]; + sprintf(buf,"150 Opening Binary mode data connection for %s (4096 bytes).\r\n",param+1); + respMessage = buf; + SendMessage(clientFd,respMessage); + // wait for download complete + printf("wait for download complete,tid=%ld\n",pthread_self()); + sem_wait(&data.isDone); + respMessage = "226 Transfer complete.\r\n"; + SendMessage(clientFd,respMessage); + }else if(strcmp(order,"STOR") == 0){ + RecvData(clientFd,param); + sprintf(data.fileName,"./out/%s",param+1); + data.type = 1; + // notify the thread of waiting fileName + sem_post(&data.isReady); + char buf[70]; + sprintf(buf,"150 Opening Binary mode data connection for %s (4096 bytes).\r\n",param+1); + respMessage = buf; + SendMessage(clientFd,respMessage); + // wait for upload complete + printf("wait for upload complete,tid=%ld\n",pthread_self()); + sem_wait(&data.isDone); + respMessage = "226 Transfer complete.\r\n"; + SendMessage(clientFd,respMessage); + } + else if(strcmp(order,"QUIT") == 0){ + printf("close clientFd=%d,tid=%ld\n",clientFd,pthread_self()); + close(clientFd); + break; + } + } + return NULL; +} + +int main(){ + serverFd = CreateServer(port,0); + sem_init(&data.isReady,0,0); + sem_init(&mutex,0,1); + pthread_t thread; + pthread_create(&thread,NULL,&DataServer,NULL); + int clientFds[THREAD_NUM]; + int i = 0; + while(1){ + struct sockaddr_in clientAdrr = {0}; + int socketLen = sizeof(clientAdrr); + clientFds[i] = accept(serverFd,(struct sockaddr *)&clientAdrr,&socketLen); + printf("accept a client:fd=%d\n",clientFds[i]); + respMessage = "220 (myFtpServer 1.0)\r\n"; + SendMessage(clientFds[i],respMessage); + printf("send welcome message successfully.\n"); + pthread_t thread; + pthread_create(&thread,NULL,&OrderServer,&clientFds[i]); + i++; + } + return 0; +} 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-22.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-22.png new file mode 100644 index 000000000..e1bae3078 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-22.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-23.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-23.png new file mode 100644 index 000000000..b5e2a992b Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-23.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-24.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-24.png new file mode 100644 index 000000000..897720f70 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-24.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-25.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-25.png new file mode 100644 index 000000000..ec6f3df43 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-25.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-26.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-26.png new file mode 100644 index 000000000..80d82d3d1 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-26.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-27.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-27.png new file mode 100644 index 000000000..c60114bda Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-27.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-28.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-28.png new file mode 100644 index 000000000..98f1d2160 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-28.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-29.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-29.png new file mode 100644 index 000000000..fdc6a1d9a Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-29.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-30.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-30.png new file mode 100644 index 000000000..248c97262 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-30.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-31.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-31.png new file mode 100644 index 000000000..121765f9d Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-31.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-32.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-32.png new file mode 100644 index 000000000..2e00b936a Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-32.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-33.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-33.png new file mode 100644 index 000000000..432974fef Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-33.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-34.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-34.png new file mode 100644 index 000000000..f75b9add0 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-34.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-35.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-35.png new file mode 100644 index 000000000..57b8fc78b Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-35.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-36.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-36.png new file mode 100644 index 000000000..f92bc2ea9 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-36.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-37.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-37.png new file mode 100644 index 000000000..0ca516df6 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-37.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-38.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-38.png new file mode 100644 index 000000000..c58057dc6 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-38.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-39.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-39.png new file mode 100644 index 000000000..b45cd4f88 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-39.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-40.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-40.png new file mode 100644 index 000000000..0c787de91 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-40.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-41.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-41.png new file mode 100644 index 000000000..c9cde1089 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-41.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-42.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-42.png new file mode 100644 index 000000000..cb6147feb Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-42.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-43.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-43.png new file mode 100644 index 000000000..885ba0192 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-43.png differ diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-44.png b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-44.png new file mode 100644 index 000000000..d41535660 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_ftpclient_final/img/image-44.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..5a2024f79 --- /dev/null +++ b/APP_Framework/Applications/app_test/test_ftpclient_final/test_ftpclient_final.c @@ -0,0 +1,93 @@ +/* +* 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]; + +/*one client upLoad a file of 4K*/ +void* UpLoad(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 = 4096; + char buf[size]; + char fileName[20]; + sprintf(fileName,"file%d",*pThreadID); + for(int i = 0;i < size;++i){ + buf[i] = '0'; + } + FtpInitData(*pThreadID); // data socket 每次下载都要重新创建,下载完都要关闭 + ret = FtpUpload(*pThreadID,fileName,buf,size); + FtpQuit(*pThreadID); + return NULL; +} + +/*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 每次下载都要重新创建,下载完都要关闭 + ret = FtpDownload(*pThreadID,fileName, buf, size); + free(buf); + FtpQuit(*pThreadID); + return NULL; +} + +/* test for 10 ftp client */ +void TestFtpClient(int argc, char* argv[]) +{ + int options = atoi(argv[1]); + int n = atoi(argv[2]); + pthread_t threads[THREAD_NUM]; + for(int i = 0;i < n;++i){ + threadIDs[i] = i; + if(options == 1){ // 全部都是下载 + pthread_create(&threads[i],NULL,&DownLoad,&threadIDs[i]); + }else if(options == 2){ // 全部都是上传 + pthread_create(&threads[i],NULL,&UpLoad,&threadIDs[i]); + }else if(options == 3){ // 随机下载/上传 + int r = rand()%2; + if(r == 0){ + printf("===============download===============\n"); + pthread_create(&threads[i],NULL,&DownLoad,&threadIDs[i]); + }else{ + printf("===============upload===============\n"); + pthread_create(&threads[i],NULL,&UpLoad,&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..a57b016f7 --- /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 upLoad a file of 4K*/ +void* UpLoad(void* arg); +/*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