From 4fb42af1a0d25eab6fa565222c9a08f656330b90 Mon Sep 17 00:00:00 2001 From: Ambrumf <421653227@qq.com> Date: Thu, 19 Oct 2023 16:10:26 +0800 Subject: [PATCH] update ftpclient --- APP_Framework/Applications/app_test/Makefile | 2 +- .../test_ftpclient_final/test_ftpclient.c | 311 ----------- .../test_ftpclient_final/test_ftpclient.h | 13 - .../test_ftpclient_final.c | 524 ++++++++++++++++++ .../test_ftpclient_final.h | 13 + .../ethernet/LwIP/include/lwip/opt.h | 2 +- 6 files changed, 539 insertions(+), 326 deletions(-) delete mode 100644 APP_Framework/Applications/app_test/test_ftpclient_final/test_ftpclient.c delete mode 100644 APP_Framework/Applications/app_test/test_ftpclient_final/test_ftpclient.h create mode 100644 APP_Framework/Applications/app_test/test_ftpclient_final/test_ftpclient_final.c create mode 100644 APP_Framework/Applications/app_test/test_ftpclient_final/test_ftpclient_final.h diff --git a/APP_Framework/Applications/app_test/Makefile b/APP_Framework/Applications/app_test/Makefile index 5160bd97d..760687239 100644 --- a/APP_Framework/Applications/app_test/Makefile +++ b/APP_Framework/Applications/app_test/Makefile @@ -126,7 +126,7 @@ ifeq ($(CONFIG_ADD_XIZI_FEATURES),y) endif ifeq ($(CONFIG_USER_TEST_FTPCLIENT),y) - SRC_FILES += test_ftpclient_final/test_ftpclient.c + SRC_FILES += test_ftpclient_final/test_ftpclient_final.c endif ifeq ($(CONFIG_USER_TEST_WEBSERVER),y) diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/test_ftpclient.c b/APP_Framework/Applications/app_test/test_ftpclient_final/test_ftpclient.c deleted file mode 100644 index fbd6a80fd..000000000 --- a/APP_Framework/Applications/app_test/test_ftpclient_final/test_ftpclient.c +++ /dev/null @@ -1,311 +0,0 @@ -/* -* Copyright (c) 2020 AIIT Ubiquitous Team -* 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_ftpclinet.c -* @brief: a application of test ftpclient -* @version: 1.0 -* @author: Ambrumf -* @date: 2023/10/11 -*/ - -#include -#include -#include -#include -#include -#include "lwip/sockets.h" -#include "test_ftpclient.h" - -char sendBuffer[1024]; -char recvBuffer[1024]; -int cmd_fd; - -static char tcp_demo_ipaddr[] = {192, 168, 130, 77}; -static char tcp_demo_netmask[] = {255, 255, 254, 0}; -static char tcp_demo_gwaddr[] = {192, 168, 130, 1}; - -//quoted from https://kerndev.blog.csdn.net/article/details/89383888 -int SendCommand(char *cmd) -{ - int ret; - ret = send(cmd_fd, cmd, (int)strlen(cmd),0); - if (ret < 0) { - return -1; - } - return 0; -} -int RecvRespond(char * respond,int len) -{ - int ret; - int off; - len -= -1; - for (off = 0;off < len;off += ret) { - ret = recv(cmd_fd,&respond[off],1,0); - if(ret < 0 ){ - printf("recv respond error\r\n"); - return -1; - } - if(respond[off] == '\n'){ - break; - } - } - respond[off + 1] = 0; - return atoi(respond); -} -int EnterPasv(uint8_t *ipaddr,int *port) -{ - int ret; - char *find; - int ip1,ip2,ip3,ip4,tmp1,tmp2; - ret = SendCommand("PASV\r\n"); - if(ret == -1){ - printf("failed to send command\n"); - return -1; - } - ret=RecvRespond(recvBuffer,1024); - if(ret == -1 ){ - printf("failed to get presond\n"); - return -1; - } - if(ret != 227){ - printf("failed to enter pasv mod\n"); - } - find=strrchr(recvBuffer,'('); - sscanf(find,"(%d,%d,%d,%d,%d,%d)",&ipaddr[0],&ipaddr[1],&ipaddr[2],&ipaddr[3],&tmp1,&tmp2); - *port = tmp1 * 256 + tmp2; - return 1; -} -int Login(uint8_t addr[4],int port,char *username,char *password) -{ - int ret; - printf("connect....\n"); - struct sockaddr_in tcp_sock; - tcp_sock.sin_family = AF_INET; - tcp_sock.sin_port = htons(port); - tcp_sock.sin_addr.s_addr = PP_HTONL(LWIP_MAKEU32(addr[0],addr[1],addr[2],addr[3])); - memset(&(tcp_sock.sin_zero), 0, sizeof(tcp_sock.sin_zero)); - ret = connect(cmd_fd, (struct sockaddr *)&tcp_sock, sizeof(struct sockaddr)); - if(ret == -1){ - printf("connect server failed\r\n"); - return -1; - } - printf("connect ok.\r\n"); - - ret = RecvRespond(recvBuffer,1024); - if(ret != 220){ - printf("bad server ret=%d\r\n",ret); - return -1; - } - printf("login....\r\n"); - sprintf(sendBuffer,"USER %s\r\n",username); - ret = SendCommand(sendBuffer); - - if(ret == -1){ - return -1; - } - ret = RecvRespond(recvBuffer,1024); - if(ret == 220)ret = RecvRespond(recvBuffer,1024); - if(ret != 331){ - return -1; - } - sprintf(sendBuffer,"PASS %s\r\n",password); - ret = SendCommand(sendBuffer); - if(ret == -1){ - printf("failed to send command\n"); - return -1; - } - ret = RecvRespond(recvBuffer,1024); - if(ret != 230){ - printf("failed to get respond\n"); - return -1; - } - printf("login sucess \r\n"); - - - ret = SendCommand("TYPE I\r\n"); - if(ret == -1){ - printf("failed to send command\n"); - return -1; - } - ret = RecvRespond(recvBuffer,1024); - if(ret != 200){ - printf("failed to get respond\n"); - return -1; - } - return 0; -} -int GetFileSize(char * name) -{ - int ret; - int size; - sprintf(sendBuffer,"SIZE %s\r\n",name); - ret = SendCommand(sendBuffer); - if(ret == -1){ - printf("failed to send command\n"); - return 0; - } - ret = RecvRespond(recvBuffer,1024); - if(ret != 213){ - printf("get file size failed\r\n"); - return 0; - } - size = atoi(recvBuffer + 4); - return size; -} -int Download(char *name) -{ - int data_fd = socket(AF_INET, SOCK_STREAM, 0); - int len = GetFileSize(name); - char *buf = malloc(len+1); - printf("downloading file %s\r\n",name); - int it; - int ret; - uint8_t addr[4]; - int port; - ret = EnterPasv(addr,&port); - if(ret == -1){ - closesocket(data_fd); - return -1; - } - struct sockaddr_in tcp_sock; - tcp_sock.sin_family = AF_INET; - tcp_sock.sin_port = htons(port); - tcp_sock.sin_addr.s_addr = PP_HTONL(LWIP_MAKEU32(addr[0],addr[1],addr[2],addr[3])); - memset(&(tcp_sock.sin_zero), 0, sizeof(tcp_sock.sin_zero)); - ret = connect(data_fd,(struct sockaddr *)&tcp_sock,sizeof(struct sockaddr)); - if(ret == -1){ - printf("fail to connect data port\r\n"); - return -1; - } - sprintf(sendBuffer,"RETR %s\r\n",name); - ret = SendCommand(sendBuffer); - if(ret == -1){ - closesocket(data_fd); - return -1; - } - ret = RecvRespond(recvBuffer,1024); - if(ret!=150){ - closesocket(data_fd); - return -1; - } - for(it = 0;it < len;it += ret){ - ret = recv(data_fd,((char *)buf + it),len,0); - if(ret<0){ - printf("download was interupted\r\n"); - break; - } - } - buf[len] = 0; - printf("download %d/%d bytes complete. \r\n",it,len); - ret = RecvRespond(recvBuffer,1024); - if(ret != 226){ - closesocket(data_fd); - return -1; - } - closesocket(data_fd); - printf("creating file %s ....\r\n",name); - FILE * file = fopen(name,"w"); - fprintf(file,buf); - fclose(file); - if(buf != NULL){ - free(buf); - } - return 0; -} -int Upload(char* name) -{ - int data_fd = socket(AF_INET, SOCK_STREAM, 0); - char* buf = malloc(5000); - printf("uploading file %s\r\n", name); - int ret; - uint8_t addr[4]; - int port; - ret = EnterPasv(addr, &port); - if (ret == -1) { - closesocket(data_fd); - return -1; - } - struct sockaddr_in tcp_sock; - tcp_sock.sin_family = AF_INET; - tcp_sock.sin_port = htons(port); - tcp_sock.sin_addr.s_addr = PP_HTONL(LWIP_MAKEU32(addr[0],addr[1],addr[2],addr[3])); - memset(&(tcp_sock.sin_zero), 0, sizeof(tcp_sock.sin_zero)); - ret = connect(data_fd, (struct sockaddr*)&tcp_sock, sizeof(struct sockaddr)); - if(ret == -1){ - printf("fail to connect data port\r\n"); - return -1; - } - sprintf(sendBuffer, "STOR %s\r\n", name); - ret = SendCommand(sendBuffer); - if(ret == -1){ - closesocket(data_fd); - return -1; - } - ret = RecvRespond(recvBuffer,1024); - if(ret!=150){ - closesocket(data_fd); - return -1; - } - - FILE* file = fopen(name, "r"); - if (file == NULL) { - printf("failed to open file\n"); - return -1; - } - - fseek(file,0,SEEK_END); - int len = ftell(file); - fseek(file,0,SEEK_SET); - - int size = fread(buf, 1, len, file); - if (size == -1) { - printf("failed to read data\n"); - return -1; - } - fclose(file); - ret = send(data_fd, buf, len,0); - closesocket(data_fd); - - ret = RecvRespond(recvBuffer, 1024); - if (ret != 226) { - return -1; - } - printf("success!\n"); - return 0; - -} -int TestFtp() -{ - lwip_config_tcp(0, tcp_demo_ipaddr, tcp_demo_netmask, tcp_demo_gwaddr); - cmd_fd = socket(AF_INET, SOCK_STREAM, 0); - uint8_t ip[4] = { 192,168,130,70 }; - Login(ip, 21, "frank", "114514"); - - Upload("File0.txt"); - // Download("File0.txt"); - // Download("File1.txt"); - // Download("File2.txt"); - // Download("File3.txt"); - // Download("File4.txt"); - // Download("File5.txt"); - // Download("File6.txt"); - // Download("File7.txt"); - // Download("File8.txt"); - // Download("File9.txt"); - - closesocket(cmd_fd); - return 0; -} -PRIV_SHELL_CMD_FUNCTION(TestFtp, Implement ftp, PRIV_SHELL_CMD_MAIN_ATTR); diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/test_ftpclient.h b/APP_Framework/Applications/app_test/test_ftpclient_final/test_ftpclient.h deleted file mode 100644 index 49e7d9650..000000000 --- a/APP_Framework/Applications/app_test/test_ftpclient_final/test_ftpclient.h +++ /dev/null @@ -1,13 +0,0 @@ -#include -#include -#include - -int SendCommand(char *cmd); -int RecvRespond(char * respond,int len); -int EnterPasv(uint8_t *ipaddr,int *port); -int Login(uint8_t addr[4],int port,char *username,char *password); -int GetFileSize(char * name); -int Download(char *name); -void Init(); -void Quit(); -int TestFtp(); \ No newline at end of file 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..96a809b7c --- /dev/null +++ b/APP_Framework/Applications/app_test/test_ftpclient_final/test_ftpclient_final.c @@ -0,0 +1,524 @@ +/* +* Copyright (c) 2020 AIIT Ubiquitous Team +* 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_ftpclinet.c +* @brief: a application of test ftpclient +* @version: 1.0 +* @author: Ambrumf +* @date: 2023/10/11 +*/ + +#include +#include +#include +#include +#include +#include +#include "lwip/sockets.h" +#include "test_ftpclient_final.h" + +pthread_mutex_t mutex; + +char buf[5000]; + +static char tcp_demo_ipaddr[] = {192, 168, 3, 77}; +static char tcp_demo_netmask[] = {255, 255, 255, 0}; +static char tcp_demo_gwaddr[] = {192, 168, 3, 1}; + +//quoted from https://kerndev.blog.csdn.net/article/details/89383888 +int SendCommand(char *cmd,int cmd_fd) +{ + pthread_mutex_lock(&mutex); + int ret; + ret = send(cmd_fd, cmd, (int)strlen(cmd),0); + if (ret < 0) { + pthread_mutex_unlock(&mutex); + return -1; + } + pthread_mutex_unlock(&mutex); + return 0; +} +int RecvRespond(char * respond,int len,int cmd_fd) +{ + pthread_mutex_lock(&mutex); + int ret; + int off; + len -= -1; + for (off = 0;off < len;off += ret) { + ret = recv(cmd_fd,&respond[off],1,0); + if(ret < 0 ){ + printf("recv respond error\r\n"); + return -1; + } + if(respond[off] == '\n'){ + break; + } + } + respond[off + 1] = 0; + char *result = malloc(50); + strcpy(result,respond); + pthread_mutex_unlock(&mutex); + return atoi(result); +} +int EnterPasv(uint8_t *ipaddr,int *port,int cmd_fd) +{ + char *sendBuffer = malloc(1024*sizeof(char)); + char *recvBuffer = malloc(1024*sizeof(char)); + int ret; + char *find; + int ip1,ip2,ip3,ip4,tmp1,tmp2; + ret = SendCommand("PASV\r\n",cmd_fd); + if(ret == -1){ + pthread_mutex_lock(&mutex); + printf("failed to send command\n"); + pthread_mutex_unlock(&mutex); + } + + ret = RecvRespond(recvBuffer,1024,cmd_fd); + if(ret == -1 ){ + pthread_mutex_lock(&mutex); + printf("failed to get presond\n"); + pthread_mutex_unlock(&mutex); + free(sendBuffer); + free(recvBuffer); + return -1; + } + if(ret != 227){ + pthread_mutex_lock(&mutex); + printf("failed to enter pasv mod\n"); + pthread_mutex_unlock(&mutex); + } + pthread_mutex_lock(&mutex); + find=strrchr(recvBuffer,'('); + sscanf(find,"(%d,%d,%d,%d,%d,%d)",&ipaddr[0],&ipaddr[1],&ipaddr[2],&ipaddr[3],&tmp1,&tmp2); + pthread_mutex_unlock(&mutex); + *port = tmp1 * 256 + tmp2; + free(sendBuffer); + free(recvBuffer); + return 1; +} +int Login(uint8_t addr[4],int port,char *username,char *password,int cmd_fd) +{ + int ret; + char *sendBuffer = malloc(1024*sizeof(char)); + char *recvBuffer = malloc(1024*sizeof(char)); + pthread_mutex_lock(&mutex); + printf("connect....\n"); + pthread_mutex_unlock(&mutex); + struct sockaddr_in tcp_sock; + tcp_sock.sin_family = AF_INET; + tcp_sock.sin_port = htons(port); + tcp_sock.sin_addr.s_addr = PP_HTONL(LWIP_MAKEU32(addr[0],addr[1],addr[2],addr[3])); + memset(&(tcp_sock.sin_zero), 0, sizeof(tcp_sock.sin_zero)); + ret = connect(cmd_fd, (struct sockaddr *)&tcp_sock, sizeof(struct sockaddr)); + if(ret == -1){ + pthread_mutex_lock(&mutex); + printf("connect server failed\r\n"); + pthread_mutex_unlock(&mutex); + return -1; + } + pthread_mutex_lock(&mutex); + printf("connect ok.\r\n"); + pthread_mutex_unlock(&mutex); + + ret = RecvRespond(recvBuffer,1024,cmd_fd); + if(ret != 220){ + pthread_mutex_lock(&mutex); + printf("bad server ret=%d\r\n",ret); + pthread_mutex_unlock(&mutex); + free(sendBuffer); + free(recvBuffer); + return -1; + } + printf("login....\r\n"); + + sprintf(sendBuffer,"USER %s\r\n",username); + ret = SendCommand(sendBuffer,cmd_fd); + + if(ret == -1){ + free(sendBuffer); + free(recvBuffer); + return -1; + } + ret = RecvRespond(recvBuffer,1024,cmd_fd); + + if(ret == 220){ + ret = RecvRespond(recvBuffer,1024,cmd_fd); + } + if(ret != 331){ + return -1; + } + + pthread_mutex_lock(&mutex); + sprintf(sendBuffer,"PASS %s\r\n",password); + pthread_mutex_unlock(&mutex); + ret = SendCommand(sendBuffer,cmd_fd); + if(ret == -1){ + pthread_mutex_lock(&mutex); + printf("failed to send command\n"); + pthread_mutex_unlock(&mutex); + free(sendBuffer); + free(recvBuffer); + return -1; + } + ret = RecvRespond(recvBuffer,1024,cmd_fd); + if(ret != 230){ + pthread_mutex_lock(&mutex); + printf("failed to get respond\n"); + pthread_mutex_unlock(&mutex); + free(sendBuffer); + free(recvBuffer); + return -1; + } + pthread_mutex_lock(&mutex); + printf("login sucess \r\n"); + pthread_mutex_unlock(&mutex); + + ret = SendCommand("TYPE I\r\n",cmd_fd); + if(ret == -1){ + pthread_mutex_lock(&mutex); + printf("failed to send command\n"); + pthread_mutex_unlock(&mutex); + free(sendBuffer); + free(recvBuffer); + return -1; + } + ret = RecvRespond(recvBuffer,1024,cmd_fd); + if(ret != 200){ + pthread_mutex_lock(&mutex); + printf("failed to get respond\n"); + pthread_mutex_unlock(&mutex); + free(sendBuffer); + free(recvBuffer); + return -1; + } + return 0; +} +int GetFileSize(char * name,int cmd_fd) +{ + char *sendBuffer = malloc(1024*sizeof(char)); + char *recvBuffer = malloc(1024*sizeof(char)); + int ret; + int size; + + pthread_mutex_lock(&mutex); + sprintf(sendBuffer,"SIZE %s\r\n",name); + pthread_mutex_unlock(&mutex); + ret = SendCommand(sendBuffer,cmd_fd); + if(ret == -1){ + pthread_mutex_lock(&mutex); + printf("failed to send command\n"); + pthread_mutex_unlock(&mutex); + free(sendBuffer); + free(recvBuffer); + return 0; + } + ret = RecvRespond(recvBuffer,1024,cmd_fd); + if(ret != 213){ + pthread_mutex_lock(&mutex); + printf("get file size failed\r\n"); + pthread_mutex_unlock(&mutex); + free(sendBuffer); + free(recvBuffer); + return 0; + } + size = atoi(recvBuffer + 4); + free(sendBuffer); + free(recvBuffer); + return size; +} +int Download(char *name,int cmd_fd) +{ + char *sendBuffer = malloc(1024*sizeof(char)); + char *recvBuffer = malloc(1024*sizeof(char)); + int data_fd = socket(AF_INET, SOCK_STREAM, 0); + int len = GetFileSize(name,cmd_fd); + pthread_mutex_lock(&mutex); + printf("downloading file %s\r\n",name); + pthread_mutex_unlock(&mutex); + int it; + int ret; + uint8_t addr[4]; + int port; + ret = EnterPasv(addr,&port,cmd_fd); + if(ret == -1){ + closesocket(data_fd); + free(sendBuffer); + free(recvBuffer); + return -1; + } + struct sockaddr_in tcp_sock; + tcp_sock.sin_family = AF_INET; + tcp_sock.sin_port = htons(port); + tcp_sock.sin_addr.s_addr = PP_HTONL(LWIP_MAKEU32(addr[0],addr[1],addr[2],addr[3])); + memset(&(tcp_sock.sin_zero), 0, sizeof(tcp_sock.sin_zero)); + ret = connect(data_fd,(struct sockaddr *)&tcp_sock,sizeof(struct sockaddr)); + if(ret == -1){ + pthread_mutex_lock(&mutex); + printf("fail to connect data port\r\n"); + pthread_mutex_unlock(&mutex); + free(sendBuffer); + free(recvBuffer); + return -1; + } + + sprintf(sendBuffer,"RETR %s\r\n",name); + ret = SendCommand(sendBuffer,cmd_fd); + if(ret == -1){ + closesocket(data_fd); + free(sendBuffer); + free(recvBuffer); + return -1; + } + ret = RecvRespond(recvBuffer,1024,cmd_fd); + if(ret!=150){ + closesocket(data_fd); + free(sendBuffer); + free(recvBuffer); + return -1; + } + for(it = 0;it < len;it += ret){ + pthread_mutex_lock(&mutex); + ret = recv(data_fd,((char *)buf + it),len,0); + pthread_mutex_unlock(&mutex); + if(ret<0){ + pthread_mutex_lock(&mutex); + printf("download was interupted\r\n"); + pthread_mutex_unlock(&mutex); + break; + } + } + //buf[len] = 0; + pthread_mutex_lock(&mutex); + printf("download %d/%d bytes complete. \r\n",it,len); + pthread_mutex_unlock(&mutex); + ret = RecvRespond(recvBuffer,1024,cmd_fd); + if(ret != 226){ + closesocket(data_fd); + free(sendBuffer); + free(recvBuffer); + return -1; + } + closesocket(data_fd); + pthread_mutex_lock(&mutex); + printf("creating file %s ....\r\n",name); + pthread_mutex_unlock(&mutex); + FILE * file = fopen(name,"w"); + pthread_mutex_lock(&mutex); + fprintf(file,buf); + pthread_mutex_unlock(&mutex); + fclose(file); + + pthread_mutex_lock(&mutex); + printf("create success!"); + pthread_mutex_unlock(&mutex); + free(sendBuffer); + free(recvBuffer); + return 0; +} +int Upload(char* name,int cmd_fd) +{ + char *sendBuffer = malloc(1024*sizeof(char)); + char *recvBuffer = malloc(1024*sizeof(char)); + int data_fd = socket(AF_INET, SOCK_STREAM, 0); + pthread_mutex_lock(&mutex); + printf("uploading file %s\r\n", name); + pthread_mutex_unlock(&mutex); + int ret; + uint8_t addr[4]; + int port; + ret = EnterPasv(addr, &port,cmd_fd); + if (ret == -1) { + closesocket(data_fd); + free(sendBuffer); + free(recvBuffer); + return -1; + } + struct sockaddr_in tcp_sock; + tcp_sock.sin_family = AF_INET; + tcp_sock.sin_port = htons(port); + tcp_sock.sin_addr.s_addr = PP_HTONL(LWIP_MAKEU32(addr[0],addr[1],addr[2],addr[3])); + memset(&(tcp_sock.sin_zero), 0, sizeof(tcp_sock.sin_zero)); + ret = connect(data_fd, (struct sockaddr*)&tcp_sock, sizeof(struct sockaddr)); + if(ret == -1){ + pthread_mutex_lock(&mutex); + printf("fail to connect data port\r\n"); + pthread_mutex_unlock(&mutex); + free(sendBuffer); + free(recvBuffer); + return -1; + } + + pthread_mutex_lock(&mutex); + sprintf(sendBuffer, "STOR %s\r\n", name); + pthread_mutex_unlock(&mutex); + ret = SendCommand(sendBuffer,cmd_fd); + if(ret == -1){ + closesocket(data_fd); + free(sendBuffer); + free(recvBuffer); + return -1; + } + ret = RecvRespond(recvBuffer,1024,cmd_fd); + if(ret!=150){ + closesocket(data_fd); + free(sendBuffer); + free(recvBuffer); + return -1; + } + + FILE* file = fopen(name, "r"); + if (file == NULL) { + pthread_mutex_lock(&mutex); + printf("failed to open file\n"); + pthread_mutex_unlock(&mutex); + free(sendBuffer); + free(recvBuffer); + return -1; + } + + fseek(file,0,SEEK_END); + int len = ftell(file); + fseek(file,0,SEEK_SET); + + pthread_mutex_lock(&mutex); + int size = fread(buf, 1, len, file); + pthread_mutex_unlock(&mutex); + + if (size == -1) { + pthread_mutex_lock(&mutex); + printf("failed to read data\n"); + pthread_mutex_unlock(&mutex); + free(sendBuffer); + free(recvBuffer); + return -1; + } + fclose(file); + pthread_mutex_lock(&mutex); + ret = send(data_fd, buf, len,0); + pthread_mutex_unlock(&mutex); + closesocket(data_fd); + + ret = RecvRespond(recvBuffer, 1024,cmd_fd); + if (ret != 226) { + free(sendBuffer); + free(recvBuffer); + return -1; + } + pthread_mutex_lock(&mutex); + printf("upload success!\n"); + pthread_mutex_unlock(&mutex); + free(sendBuffer); + free(recvBuffer); + return 0; + +} + +void *DownloadClient(void *arg) +{ + int *pointer = arg; + int num = *pointer; + pthread_mutex_lock(&mutex); + int cmd_fd = socket(AF_INET, SOCK_STREAM, 0); + pthread_mutex_unlock(&mutex); + uint8_t ip[4] = { 8,140,53,225 }; + Login(ip, 9971, "frank", "114514",cmd_fd); + char *name = malloc(20); + + pthread_mutex_lock(&mutex); + sprintf(name,"File%d.txt",num); + pthread_mutex_unlock(&mutex); + Download(name,cmd_fd); + return NULL; +} + +void *UploadClient(void *arg) +{ + int *pointer = arg; + int num = *pointer; + pthread_mutex_lock(&mutex); + int cmd_fd = socket(AF_INET, SOCK_STREAM, 0); + pthread_mutex_unlock(&mutex); + uint8_t ip[4] = { 8,140,53,225 }; + Login(ip, 9971, "frank", "114514",cmd_fd); + char *name = malloc(20); + + pthread_mutex_lock(&mutex); + sprintf(name,"File%d.txt",num); + pthread_mutex_unlock(&mutex); + Upload(name,cmd_fd); + free(name); + return NULL; +} + +int DownloadTest() +{ + pthread_mutex_init(&mutex,NULL); + + lwip_config_tcp(0, tcp_demo_ipaddr, tcp_demo_netmask, tcp_demo_gwaddr); + + pthread_mutex_lock(&mutex); + printf("start 10 client to download file\n"); + pthread_mutex_unlock(&mutex); + pthread_t thread[10]; + for(int i=0;i<10;i++){ + int *arg = malloc(1); + *arg = i; + pthread_create(&thread[i],NULL,DownloadClient,arg); + } + void *result; + for(int i=0;i<10;i++){ + pthread_join(thread[i],&result); + } + return 0; +} +PRIV_SHELL_CMD_FUNCTION(DownloadTest, Implement ftp, PRIV_SHELL_CMD_MAIN_ATTR); + +int UploadTest() +{ + pthread_mutex_init(&mutex,NULL); + + lwip_config_tcp(0, tcp_demo_ipaddr, tcp_demo_netmask, tcp_demo_gwaddr); + + pthread_mutex_lock(&mutex); + printf("start 10 client to upload file\n"); + pthread_mutex_unlock(&mutex); + pthread_t thread[10]; + for(int i=0;i<10;i++){ + int *arg = malloc(1); + *arg = i; + pthread_create(&thread[i],NULL,UploadClient,arg); + } + void *result; + for(int i=0;i<10;i++){ + pthread_join(thread[i],&result); + } + + return 0; +} +PRIV_SHELL_CMD_FUNCTION(UploadTest, Implement ftp, PRIV_SHELL_CMD_MAIN_ATTR); + +int TestFtp() +{ + lwip_config_tcp(0, tcp_demo_ipaddr, tcp_demo_netmask, tcp_demo_gwaddr); + int cmd_fd = socket(AF_INET, SOCK_STREAM, 0); + uint8_t ip[4] = { 8,140,53,225 }; + Login(ip, 9971, "frank", "114514",cmd_fd); + Download("File0.txt",cmd_fd); + + closesocket(cmd_fd); + return 0; +} +PRIV_SHELL_CMD_FUNCTION(TestFtp, Implement ftp, 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..f8afe608d --- /dev/null +++ b/APP_Framework/Applications/app_test/test_ftpclient_final/test_ftpclient_final.h @@ -0,0 +1,13 @@ +#include +#include +#include + +int SendCommand(char *cmd,int cmd_fd); +int RecvRespond(char * respond,int len,int cmd_fd); +int EnterPasv(uint8_t *ipaddr,int *port,int cmd_fd); +int Login(uint8_t addr[4],int port,char *username,char *password,int cmd_fd); +int GetFileSize(char * name,int cmd_fd); +int Download(char *name,int cmd_fd); +void Init(); +void Quit(); +int TestFtp(); \ No newline at end of file diff --git a/Ubiquitous/XiZi_IIoT/resources/ethernet/LwIP/include/lwip/opt.h b/Ubiquitous/XiZi_IIoT/resources/ethernet/LwIP/include/lwip/opt.h index a304c67c2..0928f4701 100644 --- a/Ubiquitous/XiZi_IIoT/resources/ethernet/LwIP/include/lwip/opt.h +++ b/Ubiquitous/XiZi_IIoT/resources/ethernet/LwIP/include/lwip/opt.h @@ -529,7 +529,7 @@ * (only needed if you use the sequential API, like api_lib.c) */ #if !defined MEMP_NUM_NETCONN || defined __DOXYGEN__ -#define MEMP_NUM_NETCONN 4 +#define MEMP_NUM_NETCONN 50 #endif /**