update ftpclient
This commit is contained in:
parent
ee8d4cc63a
commit
4fb42af1a0
|
@ -126,7 +126,7 @@ ifeq ($(CONFIG_ADD_XIZI_FEATURES),y)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(CONFIG_USER_TEST_FTPCLIENT),y)
|
ifeq ($(CONFIG_USER_TEST_FTPCLIENT),y)
|
||||||
SRC_FILES += test_ftpclient_final/test_ftpclient.c
|
SRC_FILES += test_ftpclient_final/test_ftpclient_final.c
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(CONFIG_USER_TEST_WEBSERVER),y)
|
ifeq ($(CONFIG_USER_TEST_WEBSERVER),y)
|
||||||
|
|
|
@ -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 <transform.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys.h>
|
|
||||||
#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);
|
|
|
@ -1,13 +0,0 @@
|
||||||
#include <transform.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
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();
|
|
|
@ -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 <transform.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys.h>
|
||||||
|
#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);
|
|
@ -0,0 +1,13 @@
|
||||||
|
#include <transform.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
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();
|
|
@ -529,7 +529,7 @@
|
||||||
* (only needed if you use the sequential API, like api_lib.c)
|
* (only needed if you use the sequential API, like api_lib.c)
|
||||||
*/
|
*/
|
||||||
#if !defined MEMP_NUM_NETCONN || defined __DOXYGEN__
|
#if !defined MEMP_NUM_NETCONN || defined __DOXYGEN__
|
||||||
#define MEMP_NUM_NETCONN 4
|
#define MEMP_NUM_NETCONN 50
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue