From eb67b45f0fde20dbcd3bbc26cf2c61a9d7ffaf42 Mon Sep 17 00:00:00 2001 From: Ambrumf <421653227@qq.com> Date: Thu, 12 Oct 2023 04:44:44 +0800 Subject: [PATCH] update ftpclient --- .../test_ftpclient_final/test_ftpclient.c | 126 ++++++++++-------- 1 file changed, 74 insertions(+), 52 deletions(-) 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 index 755ab113f..9c943efcf 100644 --- a/APP_Framework/Applications/app_test/test_ftpclient_final/test_ftpclient.c +++ b/APP_Framework/Applications/app_test/test_ftpclient_final/test_ftpclient.c @@ -30,37 +30,37 @@ http://license.coscl.org.cn/MulanPSL2 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; - int fd = socket(AF_INET, SOCK_STREAM, 0); - ret = send(fd, cmd, (int)strlen(cmd),0); - closesocket(fd); + ret = send(cmd_fd, cmd, (int)strlen(cmd),0); if (ret < 0) { - return 0; + return -1; } - return 1; + return 0; } int RecvRespond(char * respond,int len) { int ret; int off; len -= -1; - int fd = socket(AF_INET, SOCK_STREAM, 0); for (off = 0;off < len;off += ret) { - ret = recv(fd,&respond[off],1,0); + ret = recv(cmd_fd,&respond[off],1,0); if(ret < 0 ){ printf("recv respond error\r\n"); - closesocket(fd); - return 0; + return -1; } if(respond[off] == '\n'){ break; } } respond[off + 1] = 0; - closesocket(fd); return atoi(respond); } int EnterPasv(uint8_t *ipaddr,int *port) @@ -69,19 +69,20 @@ int EnterPasv(uint8_t *ipaddr,int *port) char *find; int ip1,ip2,ip3,ip4,tmp1,tmp2; ret = SendCommand("PASV\r\n"); - if(ret != 1){ - return 0; + 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){ - return 0; + printf("failed to enter pasv mod\n"); } find=strrchr(recvBuffer,'('); - sscanf(find,"(%d,%d,%d,%d,%d,%d)",&ip1,&ip2,&ip3,&ip4,&tmp1,&tmp2); - ipaddr[0] = ip1; - ipaddr[1] = ip2; - ipaddr[2] = ip3; - ipaddr[3] = ip4; + sscanf(find,"(%d,%d,%d,%d,%d,%d)",&ipaddr[0],&ipaddr[1],&ipaddr[2],&ipaddr[3],&tmp1,&tmp2); *port = tmp1 * 256 + tmp2; return 1; } @@ -95,50 +96,54 @@ int Login(uint8_t addr[4],int port,char *username,char *password) 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){ + if(ret == -1){ printf("connect server failed\r\n"); - return 0; + return -1; } printf("connect ok.\r\n"); ret = RecvRespond(recvBuffer,1024); if(ret != 220){ printf("bad server ret=%d\r\n",ret); - return 0; + return -1; } printf("login....\r\n"); sprintf(sendBuffer,"USER %s\r\n",username); ret = SendCommand(sendBuffer); - if(ret != 1){ - return 0; + if(ret == -1){ + return -1; } ret = RecvRespond(recvBuffer,1024); if(ret == 220)ret = RecvRespond(recvBuffer,1024); if(ret != 331){ - return 0; + return -1; } sprintf(sendBuffer,"PASS %s\r\n",password); ret = SendCommand(sendBuffer); - if(ret != 1){ - return 0; + if(ret == -1){ + printf("failed to send command\n"); + return -1; } ret = RecvRespond(recvBuffer,1024); if(ret != 230){ - return 0; + printf("failed to get respond\n"); + return -1; } printf("login sucess \r\n"); ret = SendCommand("TYPE I\r\n"); - if(ret != 1){ - return 0; + if(ret == -1){ + printf("failed to send command\n"); + return -1; } ret = RecvRespond(recvBuffer,1024); if(ret != 200){ - return 0; + printf("failed to get respond\n"); + return -1; } - return 1; + return 0; } int GetFileSize(char * name) { @@ -146,7 +151,8 @@ int GetFileSize(char * name) int size; sprintf(sendBuffer,"SIZE %s\r\n",name); ret = SendCommand(sendBuffer); - if(ret != 1){ + if(ret == -1){ + printf("failed to send command\n"); return 0; } ret = RecvRespond(recvBuffer,1024); @@ -159,7 +165,7 @@ int GetFileSize(char * name) } int Download(char *name) { - int fd = socket(AF_INET, SOCK_STREAM, 0); + 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); @@ -168,34 +174,33 @@ int Download(char *name) uint8_t addr[4]; int port; ret = EnterPasv(addr,&port); - - if(ret != 1){ - closesocket(fd); - return 0; + 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])); - ret = connect(fd,(struct sockaddr *)&addr,port); - if(ret != 1){ - closesocket(fd); + 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 0; + return -1; } sprintf(sendBuffer,"RETR %s\r\n",name); ret = SendCommand(sendBuffer); - if(ret != 1){ - closesocket(fd); - return 0; + if(ret == -1){ + closesocket(data_fd); + return -1; } ret = RecvRespond(recvBuffer,1024); if(ret!=150){ - closesocket(fd); - return 0; + closesocket(data_fd); + return -1; } for(it = 0;it < len;it += ret){ - ret = recv(fd,((char *)buf + it),len,0); + ret = recv(data_fd,((char *)buf + it),len,0); if(ret<0){ printf("download was interupted\r\n"); break; @@ -205,15 +210,17 @@ int Download(char *name) printf("download %d/%d bytes complete. \r\n",it,len); ret = RecvRespond(recvBuffer,1024); if(ret != 226){ - closesocket(fd); - return 0; + closesocket(data_fd); + return -1; } - closesocket(fd); + closesocket(data_fd); printf("creating file %s ....\r\n",name); int file=open(name,O_RDWR | O_CREAT); if(file > 0){ - ret = write(fd,buf,strlen(buf)); + printf("%d\n",file); + ret = write(file,buf,strlen(buf)); + printf("%d\n",ret); if(ret < 0 ){ printf("write failed\r\n"); } @@ -225,12 +232,27 @@ int Download(char *name) if(buf != NULL){ free(buf); } - return 1; + return 0; } +void CreateTestFile() +{ + int fd = open("/test.txt",O_RDWR | O_CREAT); + if(fd>0){ + printf("%d\n",fd); + char * hello="hello"; + int ret = write(fd,hello,sizeof(hello)); + printf("%d\n",ret); + close(fd); + } +} int TestFtp() { + CreateTestFile(); + + 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 };