diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/README.md b/APP_Framework/Applications/app_test/test_ftpclient_final/README.md index d9dc354cd..92d2096d6 100644 --- a/APP_Framework/Applications/app_test/test_ftpclient_final/README.md +++ b/APP_Framework/Applications/app_test/test_ftpclient_final/README.md @@ -3,8 +3,8 @@ ## 1. 简介 本项目是基于赛事提供的云服务器,实现FTP协议的Server功能,其功能支持至少10个Client端并发向Server端传输4KB大小的文件, 支持Server端并发地向至少10个Client端传输4KB大小的文件。 -test_ftpclient_final.h声明了多个客户端并发下载文件的测试函数 -test_ftpclient_final.c实现了多个客户端并发下载文件的测试函数 +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运行服务器 @@ -36,15 +36,21 @@ struct 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 n = atoi(argv[1]); + int options = atoi(argv[1]); + int n = atoi(argv[2]); for(int i = 0;i < n;++i){ threadIDs[i] = i; - pthread_create(NULL,NULL,&downLoad,&threadIDs[i]); + if(options == 1){ // for DownLoad + pthread_create(NULL,NULL,&DownLoad,&threadIDs[i]); + }else if(options == 2){ // for upLoad + pthread_create(NULL,NULL,&UpLoad,&threadIDs[i]); + } } return; } @@ -64,7 +70,7 @@ PRIV_SHELL_CMD_FUNCTION(TestFtpClient, a ftpClient test sample, PRIV_SHELL_CMD_M ![](./img/image-5.png) 5. 通过./server在云服务器运行FTP服务器 ![](./img/image-6.png) -6. 运行TestFtpClient 10,模拟10个客户端并发下载文件 +6. 运行TestFtpClient 1 10,模拟10个客户端并发下载文件 - 客户端日志 ![](./img/image-7.png) ![](./img/image-8.png) @@ -81,4 +87,20 @@ PRIV_SHELL_CMD_FUNCTION(TestFtpClient, a ftpClient test sample, PRIV_SHELL_CMD_M ![](./img/image-18.png) ![](./img/image-19.png) ![](./img/image-20.png) -![](./img/image-21.png) \ No newline at end of file +![](./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) \ 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 index aa4574dee..4e1cb554f 100644 --- 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 @@ -89,7 +89,53 @@ static int FtpEnterPasv(int threadID,char *ipaddr, int *port) *port = pa * 256 + pb; return 1; } + +int FtpUpload(int threadID,char *name, void *buf, int len) +{ + int ret; + char ipaddr[32]; + int port; + + //查询数据地址 + ret=FtpEnterPasv(threadID,ipaddr, &port); + if(ret != 1) + { + return 0; + } + ret=SocketConnect(m_socket_data[threadID], ipaddr, port); + if(ret != 1) + { + return 0; + } + //准备上传 + sprintf(m_send_buffer[threadID], "STOR %s\r\n", name); + ret = FtpSendCommand(threadID,m_send_buffer[threadID]); + if(ret != 1) + { + return 0; + } + ret = FtpRecvRespond(threadID,m_recv_buffer[threadID], 1024); + if(ret != 150) + { + SocketClose(m_socket_data[threadID]); + return 0; + } + + //开始上传 + ret = SocketSend(m_socket_data[threadID], buf, len); + if(ret != len) + { + printf("send data error!\r\n"); + SocketClose(m_socket_data[threadID]); + return 0; + } + SocketClose(m_socket_data[threadID]); + //上传完成,等待回应 + ret = FtpRecvRespond(threadID,m_recv_buffer[threadID], 1024); + return (ret==226); +} + int FtpDownload(int threadID,char *name, void *buf, int len) { int i; diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_client/ftp_client.h b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_client/ftp_client.h index 25424d4cc..da8e37a41 100644 --- a/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_client/ftp_client.h +++ b/APP_Framework/Applications/app_test/test_ftpclient_final/ftp_client/ftp_client.h @@ -41,4 +41,6 @@ int FtpFileSize(int threadID,char *name); /* ftp download file*/ int FtpDownload(int threadID,char *name, void *buf, int len); +/*ftp upload*/ +int FtpUpload(int threadID,char *name, void *buf, int len); #endif 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-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/test_ftpclient_final.c b/APP_Framework/Applications/app_test/test_ftpclient_final/test_ftpclient_final.c index 80bb0f010..117421842 100644 --- 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 @@ -28,11 +28,27 @@ int threadIDs[THREAD_NUM]; -void delay(int n){ - for(int i = 0;i < n;++i); +/*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){ +void* DownLoad(void* arg){ int *pThreadID = (int*)arg; printf("in thread:tid=%ld\n", pthread_self()); FtpInitCmd(*pThreadID); @@ -43,7 +59,6 @@ void* downLoad(void* arg){ size = FtpFileSize(*pThreadID,fileName); buf = malloc(size); FtpInitData(*pThreadID); // data socket 每次下载都要重新创建,下载完都要关闭 - delay(1000); ret = FtpDownload(*pThreadID,fileName, buf, size); free(buf); FtpQuit(*pThreadID); @@ -53,10 +68,15 @@ void* downLoad(void* arg){ /* test for 10 ftp client */ void TestFtpClient(int argc, char* argv[]) { - int n = atoi(argv[1]); + int options = atoi(argv[1]); + int n = atoi(argv[2]); for(int i = 0;i < n;++i){ threadIDs[i] = i; - pthread_create(NULL,NULL,&downLoad,&threadIDs[i]); + if(options == 1){ // for DownLoad + pthread_create(NULL,NULL,&DownLoad,&threadIDs[i]); + }else if(options == 2){ // for upLoad + pthread_create(NULL,NULL,&UpLoad,&threadIDs[i]); + } } return; } 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 index cc6820ea4..a57b016f7 100644 --- 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 @@ -24,12 +24,12 @@ #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); +void* DownLoad(void* arg); /* test for ftp client */ void TestFtpClient(int argc, char* argv[]); - #ifdef __cplusplus } #endif