环境: linux ubuntu系统上实现
最好的方法就是 下载一个busybox,然后参考里面的源码
ftp 服务器端配置:
1. apt-get install vsftpd
2. gedit /etc/vsftpd.conf
write_enable=YES
utf8_filesystem=YES
local_root=/home/linn/ftp
3.ftp 192.168.3.111 用户名和密码是linux的
ftp 客户端代码:
/******************************************************************************
** file: app_ftp.c
**
** History Information Description
**
** Date Author Modification
** 2019/08/13 linn Create
******************************************************************************/
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<stdlib.h>
#include <arpa/inet.h>
#define SAddr struct sockaddr
#define FTP_DATE_MAXSIZE 1024
static int control_sockfd;
static int ftp_socket_command(char *com,char *flag,char *data)
{
int send_count,recv_count;
char sendline[FTP_DATE_MAXSIZE],recvline[FTP_DATE_MAXSIZE];
int len;
printf("====command:%s flag:%s\n",com,flag);
if(com)
{
memset(sendline,0,FTP_DATE_MAXSIZE);
strcat(sendline,com);
strcat(sendline,"\r\n");
send_count=send(control_sockfd,sendline,strlen(sendline),0);
if(send_count<0)
{
printf("==%d==send is wrong\n",__LINE__);
return 0;
}
}
if(flag)
{
memset(recvline,0,FTP_DATE_MAXSIZE);
len=strlen(flag);
recv_count=recv(control_sockfd,recvline,sizeof(recvline),0);
if(recv_count>0)
{
printf("====recv:%s",recvline);
if(strncmp(recvline,flag,len)!=0)
return 0;
}
else
return 0;
}
if(data)
{
strcpy(data,recvline);
}
return 1;
}
static int app_ftp_login(char *service_ip,char *user,char *pwd,int port)
{
printf("====begin login ftp service===\n");
struct sockaddr_in serv_addr;
char com[32];
control_sockfd=socket(AF_INET,SOCK_STREAM,0);
if(control_sockfd<0)
{
printf("==%d==socket is error\n",__LINE__);
return 0;
}
memset(&serv_addr,0,sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(port);
serv_addr.sin_addr.s_addr=inet_addr(service_ip);
if((connect(control_sockfd,(SAddr*)&serv_addr,sizeof(serv_addr)))<0)
{
printf("==%d==connect is error\n",__LINE__);
return 0;
}
if(!ftp_socket_command(NULL,"220",NULL))
return 0;
memset(com,0,32);
sprintf(com,"USER %s",user);
if(!ftp_socket_command(com,"331",NULL))
return 0;
memset(com,0,32);
sprintf(com,"PASS %s",pwd);
if(!ftp_socket_command(com,"230",NULL))
return 0;
printf("=====end login ok\n");
return 1;
}
static void app_ftp_pwd(char *path)
{
printf("=====get pwd begin====\n");
char recvline[FTP_DATE_MAXSIZE];
char *p,*delim="\"",com[32];
memset(com,0,32);
strcpy(com,"PWD");
memset(recvline,0,FTP_DATE_MAXSIZE);
if(!ftp_socket_command(com,"257",recvline))
return;
p=strtok(recvline,delim);
p=strtok(NULL,delim);
strcpy(path,p);
printf("====path=%s\n",path);
printf("=====get pwd OK====\n");
}
static void app_ftp_list()
{
printf("=====get list begin====\n");
char recvline[FTP_DATE_MAXSIZE];
struct sockaddr_in serv_addr;
int data_sockfd,port;
char service_ip[16];
char *p,*tmp,*delim="()",com[32];
int i=1,flag=0;
memset(com,0,32);
strcpy(com,"PASV");
memset(recvline,0,FTP_DATE_MAXSIZE);
if(!ftp_socket_command(com,"227",recvline))
return;
//227 Entering Passive Mode (192,168,3,111,163,253).
p=strtok(recvline,delim);
p=strtok(NULL,delim);
memset(service_ip,0,16);
strcpy(com,",");
delim=com;
tmp=strtok(p,delim);
strcpy(service_ip,tmp);
while((tmp=strtok(NULL,delim)))
{
if(i==4)
{
port=atoi(tmp)*256;
}
else if(i==5)
{
port+=atoi(tmp);
}
else
{
strcat(service_ip,".");
strcat(service_ip,tmp);
}
i++;
}
printf("===service_ip=%s %d\n",service_ip,port);
data_sockfd=socket(AF_INET,SOCK_STREAM,0);
if(data_sockfd<0)
{
printf("====socket is error\n");
return ;
}
memset(&serv_addr,0,sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(port);
serv_addr.sin_addr.s_addr=inet_addr(service_ip);
if((connect(data_sockfd,(SAddr*)&serv_addr,sizeof(serv_addr)))<0)
{
printf("==%d==connect is error\n",__LINE__);
return ;
}
memset(com,0,32);
strcpy(com,"TYPE I");
if(!ftp_socket_command(com,"200",NULL))
return;
memset(com,0,32);
strcpy(com,"LIST");
if(!ftp_socket_command(com,NULL,NULL))
return;
while(1)
{
memset(recvline,0,FTP_DATE_MAXSIZE);
if(recv(data_sockfd,recvline,sizeof(recvline),0)>0)
printf("==data sockfd==%s\n",recvline);
else
break;
if(flag==0)
{
if(ftp_socket_command(NULL,"226",NULL))
flag=1;
}
}
close(data_sockfd);
}
static void ftp_changdir(char *dir)
{
char com[32];
memset(com,0,32);
sprintf(com,"CWD %s",dir);
if(!ftp_socket_command(com,"250",NULL))
return;
printf("====change dir OK\n");
}
int main()
{
char path[128];
app_ftp_login("192.168.3.111","linn","1234",21);
app_ftp_pwd(path);
app_ftp_list();
printf("------------------------\n\n\n");
app_ftp_pwd(path);
ftp_changdir("test");
app_ftp_pwd(path);
close(control_sockfd);
return 0;
}