ftp 服务器端配置与客户端C源码

环境:   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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值