xiuos/APP_Framework/Applications/app_test/test_ftpclient_final
yanglong 56216a530d Optimization server algorithm and add a test 2023-10-11 13:17:06 +08:00
..
ftp_client add concurrent upload function 2023-09-17 17:04:59 +08:00
ftp_server Optimization server algorithm and add a test 2023-10-11 13:17:06 +08:00
img Optimization server algorithm and add a test 2023-10-11 13:17:06 +08:00
README.md Optimization server algorithm and add a test 2023-10-11 13:17:06 +08:00
test_ftpclient_final.c Optimization server algorithm and add a test 2023-10-11 13:17:06 +08:00
test_ftpclient_final.h add concurrent upload function 2023-09-17 17:04:59 +08:00

README.md

决赛一级赛题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客户端等操作
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下)
#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表示线程数/模拟的并发客户端数目
/* 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
  2. 编译
  3. 烧写
  4. xshell连接串口终端并配置ip
  5. 通过./server在云服务器运行FTP服务器
  6. 运行TestFtpClient 1 10模拟10个客户端并发下载文件
  • 客户端日志
  • 服务器日志
  1. 运行TestFtpClient 2 10模拟10个客户端并发上传文件
  • 客户端日志
  • 服务器日志
  • 上传结果
  1. 运行TestFtpClient 3 10模拟10个客户端混合并发下载和上传文件
  • 客户端日志

  • 服务器日志

  • 下载和上传结果