add ftpclient final
|
@ -134,7 +134,7 @@ ifeq ($(CONFIG_ADD_XIZI_FEATURES),y)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(CONFIG_USER_TEST_FTPCLIENT),y)
|
ifeq ($(CONFIG_USER_TEST_FTPCLIENT),y)
|
||||||
SRC_FILES +=
|
SRC_FILES += test_ftpclient_final/test_ftpclient_final.c test_ftpclient_final/ftp_client/ftp_client.c test_ftpclient_final/ftp_client/my_socket.c
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(CONFIG_USER_TEST_LORA_P2P),y)
|
ifeq ($(CONFIG_USER_TEST_LORA_P2P),y)
|
||||||
|
|
|
@ -0,0 +1,84 @@
|
||||||
|
# 决赛一级赛题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运行服务器
|
||||||
|
## 2. 数据结构设计说明
|
||||||
|
- ftp_client.c 的设计
|
||||||
|
分别定义了发送命令和接收数据的socket和相应的缓冲区并且实现了登录、发送命令、接收响应数据、查找文件大小、进入被动模式、下载文件、关闭ftp客户端等操作
|
||||||
|
```c
|
||||||
|
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下)
|
||||||
|
```c
|
||||||
|
#define THREAD_NUM 10 // 可接受的客户端数目
|
||||||
|
static int isBinary = 0; // 是否是二进制传输文件
|
||||||
|
static int port = 9992; // 命令服务器端口
|
||||||
|
static int dataPort = 9993; // 文件传输服务器端口
|
||||||
|
static char order[4]; // 存储命令
|
||||||
|
static char param[20]; // 存储命令参数
|
||||||
|
static char *respMessage; // 响应消息指针
|
||||||
|
static int serverFd; // 命令服务器的socket fd
|
||||||
|
static int dataServerFd; // 文件传输服务器的 socket fd
|
||||||
|
struct Data{ // 用于线程间通信
|
||||||
|
sem_t isReady; // 命令服务器是否收到并写好文件名
|
||||||
|
sem_t isDone; // 文件传输服务器是否传输完文件
|
||||||
|
char fileName[20]; // 存储文件名
|
||||||
|
};
|
||||||
|
```
|
||||||
|
## 3. 测试程序说明
|
||||||
|
- test_ftpclient_final.c用于测试多个客户端并发下载文件
|
||||||
|
通过多线程模拟多个客户端并发访问服务器
|
||||||
|
```c
|
||||||
|
/* test for 10 ftp client */
|
||||||
|
void TestFtpClient(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
int n = atoi(argv[1]);
|
||||||
|
for(int i = 0;i < n;++i){
|
||||||
|
threadIDs[i] = i;
|
||||||
|
pthread_create(NULL,NULL,&downLoad,&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 10,模拟10个客户端并发下载文件
|
||||||
|
- 客户端日志
|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|
- 服务器日志
|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
|
@ -0,0 +1,253 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2020 AIIT XUOS Lab
|
||||||
|
* 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: ftp_client.c
|
||||||
|
* @brief: ftp client tool
|
||||||
|
* @version: 1.0
|
||||||
|
* @author: bdislab_final
|
||||||
|
* @date: 2023/9/16
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include "my_socket.h"
|
||||||
|
#include "ftp_client.h"
|
||||||
|
|
||||||
|
|
||||||
|
static int m_socket_cmd[THREAD_NUM];
|
||||||
|
static int m_socket_data[THREAD_NUM];
|
||||||
|
static char m_send_buffer[THREAD_NUM][1024];
|
||||||
|
static char m_recv_buffer[THREAD_NUM][1024];
|
||||||
|
|
||||||
|
static int FtpSendCommand(int threadID,char *cmd)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
printf("send command: %s,threadID=%d\r\n", cmd,threadID);
|
||||||
|
ret = SocketSend(m_socket_cmd[threadID], cmd, (int)strlen(cmd));
|
||||||
|
if(ret < 0)
|
||||||
|
{
|
||||||
|
printf("failed to send command: %s\r\n",cmd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int FtpRecvRespond(int threadID,char *resp, int len)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
int off;
|
||||||
|
len -= 1;
|
||||||
|
for(off=0; off<len; off+=ret)
|
||||||
|
{
|
||||||
|
ret = SocketRecv(m_socket_cmd[threadID], &resp[off], 1);
|
||||||
|
if(ret < 0)
|
||||||
|
{
|
||||||
|
printf("recv respond error(ret=%d)!\r\n", ret);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if(resp[off] == '\n')
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
resp[off+1] = 0;
|
||||||
|
printf("respond:%s,threadID=%d\r\n", resp,threadID);
|
||||||
|
return atoi(resp);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int FtpEnterPasv(int threadID,char *ipaddr, int *port)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
char *find;
|
||||||
|
int a,b,c,d;
|
||||||
|
int pa,pb;
|
||||||
|
ret = FtpSendCommand(threadID,"PASV\r\n");
|
||||||
|
if(ret != 1)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
ret = FtpRecvRespond(threadID,m_recv_buffer[threadID], 1024);
|
||||||
|
if(ret != 227)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
find = strrchr(m_recv_buffer[threadID], '(');
|
||||||
|
sscanf(find, "(%d,%d,%d,%d,%d,%d)", &a, &b, &c, &d, &pa, &pb);
|
||||||
|
sprintf(ipaddr, "%d.%d.%d.%d", a, b, c, d);
|
||||||
|
*port = pa * 256 + pb;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int FtpDownload(int threadID,char *name, void *buf, int len)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int ret;
|
||||||
|
char ipaddr[32];
|
||||||
|
int port;
|
||||||
|
|
||||||
|
//查询数据地址
|
||||||
|
ret = FtpEnterPasv(threadID,ipaddr, &port);
|
||||||
|
if(ret != 1)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
printf("m_socket_data[threadID]=%d,threadID=%d\n",m_socket_data[threadID],threadID);
|
||||||
|
//连接数据端口
|
||||||
|
ret = SocketConnect(m_socket_data[threadID], ipaddr, port);
|
||||||
|
if(ret != 1)
|
||||||
|
{
|
||||||
|
printf("failed to connect data port\r\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//准备下载
|
||||||
|
sprintf(m_send_buffer[threadID], "RETR %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;
|
||||||
|
}
|
||||||
|
|
||||||
|
//开始下载,读取完数据后,服务器会自动关闭连接
|
||||||
|
for(i=0; i<len; i+=ret)
|
||||||
|
{
|
||||||
|
ret = SocketRecv(m_socket_data[threadID], ((char *)buf) + i, len);
|
||||||
|
printf("download %d/%d.,threadID=%d\r\n", i + ret, len,threadID);
|
||||||
|
if(ret < 0)
|
||||||
|
{
|
||||||
|
printf("download was interrupted.\r\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//下载完成
|
||||||
|
printf("download %d/%d bytes complete.,threadID=%d\r\n", i, len,threadID);
|
||||||
|
// FILE *fp = NULL;
|
||||||
|
|
||||||
|
// fp = fopen(name+1, "wb");
|
||||||
|
// fwrite(buf,len,1,fp);
|
||||||
|
// fclose(fp);
|
||||||
|
|
||||||
|
SocketClose(m_socket_data[threadID]);
|
||||||
|
ret = FtpRecvRespond(threadID,m_recv_buffer[threadID], 1024);
|
||||||
|
return (ret==226);
|
||||||
|
}
|
||||||
|
|
||||||
|
int FtpFileSize(int threadID,char *name)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
int size;
|
||||||
|
sprintf(m_send_buffer[threadID],"SIZE %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 != 213)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
size = atoi(m_recv_buffer[threadID] + 4);
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
int FtpLogin(int threadID,char *addr, int port, char *username, char *password)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
printf("connect...,threadID=%d\r\n",threadID);
|
||||||
|
ret = SocketConnect(m_socket_cmd[threadID], addr, port);
|
||||||
|
if(ret != 1)
|
||||||
|
{
|
||||||
|
printf("connect server failed!\r\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
printf("connect ok.,threadID=%d\r\n",threadID);
|
||||||
|
//等待欢迎信息
|
||||||
|
ret = FtpRecvRespond(threadID,m_recv_buffer[threadID], 1024);
|
||||||
|
if(ret != 220)
|
||||||
|
{
|
||||||
|
printf("bad server, ret=%d!\r\n", ret);
|
||||||
|
SocketClose(m_socket_cmd[threadID]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("login...threadID=%d\r\n",threadID);
|
||||||
|
//发送USER
|
||||||
|
sprintf(m_send_buffer[threadID], "USER %s\r\n", username);
|
||||||
|
ret = FtpSendCommand(threadID,m_send_buffer[threadID]);
|
||||||
|
if(ret != 1)
|
||||||
|
{
|
||||||
|
SocketClose(m_socket_cmd[threadID]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
ret = FtpRecvRespond(threadID,m_recv_buffer[threadID], 1024);
|
||||||
|
if(ret != 331)
|
||||||
|
{
|
||||||
|
SocketClose(m_socket_cmd[threadID]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//发送PASS
|
||||||
|
sprintf(m_send_buffer[threadID], "PASS %s\r\n", password);
|
||||||
|
ret = FtpSendCommand(threadID,m_send_buffer[threadID]);
|
||||||
|
if(ret != 1)
|
||||||
|
{
|
||||||
|
SocketClose(m_socket_cmd[threadID]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
ret = FtpRecvRespond(threadID,m_recv_buffer[threadID], 1024);
|
||||||
|
if(ret != 230)
|
||||||
|
{
|
||||||
|
SocketClose(m_socket_cmd[threadID]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
printf("login success.threadID=%d\r\n",threadID);
|
||||||
|
|
||||||
|
//设置为二进制模式
|
||||||
|
ret = FtpSendCommand(threadID,"TYPE I\r\n");
|
||||||
|
if(ret != 1)
|
||||||
|
{
|
||||||
|
SocketClose(m_socket_cmd[threadID]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
ret = FtpRecvRespond(threadID,m_recv_buffer[threadID], 1024);
|
||||||
|
if(ret != 200)
|
||||||
|
{
|
||||||
|
SocketClose(m_socket_cmd[threadID]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FtpQuit(int threadID)
|
||||||
|
{
|
||||||
|
FtpSendCommand(threadID,"QUIT\r\n");
|
||||||
|
SocketClose(m_socket_cmd[threadID]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FtpInitCmd(int threadID)
|
||||||
|
{
|
||||||
|
m_socket_cmd[threadID] = SocketCreate();
|
||||||
|
}
|
||||||
|
|
||||||
|
void FtpInitData(int threadID){
|
||||||
|
m_socket_data[threadID]= SocketCreate();
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2020 AIIT XUOS Lab
|
||||||
|
* 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: ftp_client.h
|
||||||
|
* @brief: ftp client tool
|
||||||
|
* @version: 1.0
|
||||||
|
* @author: bdislab_final
|
||||||
|
* @date: 2023/9/16
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FTP_CLIENT_H
|
||||||
|
#define FTP_CLIENT_H
|
||||||
|
|
||||||
|
#define THREAD_NUM 10
|
||||||
|
|
||||||
|
/* init ftp cmd socket */
|
||||||
|
void FtpInitCmd(int threadID);
|
||||||
|
|
||||||
|
/* init ftp data socket */
|
||||||
|
void FtpInitData(int threadID);
|
||||||
|
|
||||||
|
/* quit ftp */
|
||||||
|
void FtpQuit(int threadID);
|
||||||
|
|
||||||
|
/* fpt login */
|
||||||
|
int FtpLogin(int threadID,char *addr, int port, char *username, char *password);
|
||||||
|
|
||||||
|
/* get file size */
|
||||||
|
int FtpFileSize(int threadID,char *name);
|
||||||
|
|
||||||
|
/* ftp download file*/
|
||||||
|
int FtpDownload(int threadID,char *name, void *buf, int len);
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,55 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2020 AIIT XUOS Lab
|
||||||
|
* 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: my_socket.c
|
||||||
|
* @brief: a abstract socket api
|
||||||
|
* @version: 1.0
|
||||||
|
* @author: bdislab_final
|
||||||
|
* @date: 2023/9/16
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "my_socket.h"
|
||||||
|
#include <sockets.h>
|
||||||
|
#include <def.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int SocketCreate(void){
|
||||||
|
return socket(AF_INET,SOCK_STREAM,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int SocketConnect(int sock, const char *addr, int port){
|
||||||
|
// unsigned int iRemoteAddr = 0;
|
||||||
|
struct sockaddr_in stRemoteAddr = {0}; //对端,即目标地址信息
|
||||||
|
|
||||||
|
stRemoteAddr.sin_family = AF_INET;
|
||||||
|
stRemoteAddr.sin_port = htons(port);
|
||||||
|
stRemoteAddr.sin_addr.s_addr = inet_addr(addr);
|
||||||
|
int res = connect(sock,(struct sockaddr *)&stRemoteAddr,sizeof(stRemoteAddr));
|
||||||
|
if(res == -1){
|
||||||
|
printf("error:%d,str error:%s\n",errno,strerror(errno));
|
||||||
|
}
|
||||||
|
return res == 0 ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int SocketSend(int sock, void *data, int len){
|
||||||
|
return send(sock,data,len,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int SocketRecv(int sock, void *data, int len){
|
||||||
|
return recv(sock,data,len,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SocketClose(int sock){
|
||||||
|
close(sock);
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2020 AIIT XUOS Lab
|
||||||
|
* 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 my_socket.h
|
||||||
|
* @brief a abstract socket api
|
||||||
|
* @version 1.0
|
||||||
|
* @author bdislab_final
|
||||||
|
* @date 2023/9/16
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MYSOCKET_H
|
||||||
|
#define MYSOCKET_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/* create a socket */
|
||||||
|
int SocketCreate(void);
|
||||||
|
|
||||||
|
/* connect a socket */
|
||||||
|
int SocketConnect(int sock, const char *addr, int port);
|
||||||
|
|
||||||
|
/* send data through socket*/
|
||||||
|
int SocketSend(int sock, void *data, int len);
|
||||||
|
|
||||||
|
/* receive data from socket*/
|
||||||
|
int SocketRecv(int sock, void *data, int len);
|
||||||
|
|
||||||
|
/* close socket*/
|
||||||
|
void SocketClose(int sock);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
After Width: | Height: | Size: 97 KiB |
After Width: | Height: | Size: 201 KiB |
After Width: | Height: | Size: 218 KiB |
After Width: | Height: | Size: 165 KiB |
After Width: | Height: | Size: 264 KiB |
After Width: | Height: | Size: 207 KiB |
After Width: | Height: | Size: 350 KiB |
After Width: | Height: | Size: 172 KiB |
After Width: | Height: | Size: 247 KiB |
After Width: | Height: | Size: 336 KiB |
After Width: | Height: | Size: 269 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 473 KiB |
After Width: | Height: | Size: 331 KiB |
After Width: | Height: | Size: 48 KiB |
After Width: | Height: | Size: 31 KiB |
After Width: | Height: | Size: 114 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 235 KiB |
After Width: | Height: | Size: 211 KiB |
After Width: | Height: | Size: 230 KiB |
After Width: | Height: | Size: 55 KiB |
|
@ -0,0 +1,63 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2020 AIIT XUOS Lab
|
||||||
|
* 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_ftpclient.c
|
||||||
|
* @brief: a ftpClient test sample
|
||||||
|
* @version: 1.0
|
||||||
|
* @author: bdislab_final
|
||||||
|
* @date: 2023/9/16
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "test_ftpclient_final.h"
|
||||||
|
#include "ftp_client/ftp_client.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <transform.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
|
int threadIDs[THREAD_NUM];
|
||||||
|
|
||||||
|
void delay(int n){
|
||||||
|
for(int i = 0;i < n;++i);
|
||||||
|
}
|
||||||
|
/*one client downLoad a file of 4K*/
|
||||||
|
void* downLoad(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;
|
||||||
|
char *buf;
|
||||||
|
char fileName[20] = "/file1";
|
||||||
|
size = FtpFileSize(*pThreadID,fileName);
|
||||||
|
buf = malloc(size);
|
||||||
|
FtpInitData(*pThreadID); // data socket 每次下载都要重新创建,下载完都要关闭
|
||||||
|
delay(1000);
|
||||||
|
ret = FtpDownload(*pThreadID,fileName, buf, size);
|
||||||
|
free(buf);
|
||||||
|
FtpQuit(*pThreadID);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* test for 10 ftp client */
|
||||||
|
void TestFtpClient(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
int n = atoi(argv[1]);
|
||||||
|
for(int i = 0;i < n;++i){
|
||||||
|
threadIDs[i] = i;
|
||||||
|
pthread_create(NULL,NULL,&downLoad,&threadIDs[i]);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
PRIV_SHELL_CMD_FUNCTION(TestFtpClient, a ftpClient test sample, PRIV_SHELL_CMD_MAIN_ATTR);
|
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2020 AIIT XUOS Lab
|
||||||
|
* 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_ftpclient.h
|
||||||
|
* @brief a ftpClient test sample
|
||||||
|
* @version 1.0
|
||||||
|
* @author bdislab_final
|
||||||
|
* @date 2023/9/16
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TEST_FTPCLIENT_H
|
||||||
|
#define TEST_FTPCLIENT_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*one client downLoad 10 files of 4K*/
|
||||||
|
void* downLoad(void* arg);
|
||||||
|
/* test for ftp client */
|
||||||
|
void TestFtpClient(int argc, char* argv[]);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|