Ftp客户端程序


/*============================================================================
 Name        : FtpClient.cbp
 Author      : Haier
 Version     : 1.01
 Copyright   : Copyright (c) 2014
 Description : Ftp Client in C, Ansi-style, Compile by Gcc,in Linux
 ============================================================================*/
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>

#define TRUE (1)
#define BUFFER (1024)


char UserCmd[10],CmdArg[20];
void pwd(int Sock,int SockMsg);
void dir(int Sock,int SockMsg);
void cd(int Sock,int SockMsg,char *DirName);
void cdback(int Sock,int SockMsg);
void quit(int Sock,int SockMsg);
void help(int Sock,int SockMsg);
void get(int Sock,int SockMsg,char *FileName);
void put(int Sock,int SockMsg,char *FileName);


int main(int argc,char *argv[])
{
    int Sock,SockMsg;
    struct hostent *Host;
    argv[1]="test02";
    argv[2]="5500";
    struct sockaddr_in Server,ServerMsg;

    Sock   =socket(AF_INET,SOCK_STREAM,0);
    SockMsg=socket(AF_INET,SOCK_STREAM,0);
    if(Sock<0 || SockMsg<0)
    {
        perror("Socket Failed !\n");
        exit(1);
    }

    Host=gethostbyname(argv[1]);
    if(Host==0)
    {
        fprintf(stderr,"%s:Unknown host !\n",argv[1]);
        exit(1);
    }

    Server.sin_family=AF_INET;
    Server.sin_port  =htons(atoi(argv[2]));
    memcpy((char*)&Server.sin_addr,(char*)Host->h_addr,Host->h_length);

    ServerMsg.sin_family=AF_INET;
    ServerMsg.sin_port  =htons(atoi(argv[2])+1);
    memcpy((char*)&ServerMsg.sin_addr,(char*)Host->h_addr,Host->h_length);

    if(connect(Sock,(struct sockaddr *)&Server,sizeof(Server)))
    {
        perror("1:Connect Failed !\n");
        exit(1);
    }


    if(connect(SockMsg,(struct sockaddr *)&ServerMsg,sizeof(ServerMsg)))
    {
        perror("2:Connect Failed !\n");
        exit(1);
    }

    while(TRUE)
    {
        memset(UserCmd,0,sizeof(UserCmd));
        memset(CmdArg,0,sizeof(CmdArg));

        printf("ftp>");
        scanf("%s",UserCmd);

        if(strcmp(UserCmd,"quit")==0)
        {
            quit(Sock,SockMsg);
            close(Sock);
            close(SockMsg);
            exit(0);
        }
        else if(strcmp(UserCmd,"?")==0)
        {
            help(Sock,SockMsg);
        }
        else if(strcmp(UserCmd,"pwd")==0)
        {
            pwd(Sock,SockMsg);
        }
        else if(strcmp(UserCmd,"dir")==0)
        {
            dir(Sock,SockMsg);
        }
        else if(strcmp(UserCmd,"cd")==0)
        {
            scanf("%s",CmdArg);
            cd(Sock,SockMsg,CmdArg);
        }
        else if(strcmp(UserCmd,"cd..")==0)
        {
            cdback(Sock,SockMsg);
        }
        else if(strcmp(UserCmd,"get")==0)
        {
            scanf("%s",CmdArg);
            get(Sock,SockMsg,CmdArg);
        }
        else if(strcmp(UserCmd,"put")==0)
        {
            scanf("%s",CmdArg);
            put(Sock,SockMsg,CmdArg);
        }
        else
        {
            printf("Unknown Command !\n");
        }
    }
}


void pwd(int Sock,int SockMsg)
{
    char DirName[30];
    write(SockMsg,UserCmd,sizeof(UserCmd));
    read(Sock,DirName,sizeof(DirName));
    printf("%s",DirName);
}

void dir(int Sock,int SockMsg)
{
    int i,FileCount;
    char FileInfo[50];

    write(SockMsg,UserCmd,sizeof(UserCmd));
    read(Sock,&FileCount,sizeof(FileCount));

    if(FileCount>0)
    {
        printf("FileCount: %d\n",FileCount);

        for(i=0; i<FileCount; i++)
        {
            memset(FileInfo,0,sizeof(FileInfo));
            read(Sock,FileInfo,sizeof(FileInfo));
            printf("%s\n",FileInfo);
        }
    }
    else if(FileCount==0)
    {
        printf("Empty !\n");
        return ;
    }
    else
    {
        printf("Error in dir !\n");
        return ;
    }
}

void cd(int Sock,int SockMsg,char *DirName)
{
    char CurrentDirPath[100];

    write(SockMsg,UserCmd,sizeof(UserCmd));
    write(SockMsg,CmdArg,sizeof(CmdArg));
    read(Sock,CurrentDirPath,sizeof(CurrentDirPath));
    printf("%s\n",CurrentDirPath);
}

void cdback(int Sock,int SockMsg)
{
    write(SockMsg,UserCmd,sizeof(UserCmd));
}

void quit(int Sock,int SockMsg)
{
    write(SockMsg,UserCmd,sizeof(UserCmd));
}

void help(int Sock,int SockMsg)
{
    char helpBuf[200];

    write(SockMsg,UserCmd,sizeof(UserCmd));
    read(Sock,helpBuf,sizeof(helpBuf));

    printf("%s\n",helpBuf);
}

void get(int Sock,int SockMsg,char *FileName)
{
    char LocalFilePath[100];
    int fd;
    char Buffer[BUFFER];
    long FileSize;

    write(SockMsg,UserCmd,sizeof(UserCmd));
    write(SockMsg,CmdArg,sizeof(CmdArg));
    printf("%s,%s\n",UserCmd,CmdArg);

    memset(LocalFilePath,0,sizeof(LocalFilePath));
    getcwd(LocalFilePath,sizeof(LocalFilePath));
    strcat(LocalFilePath,"/");
    strcat(LocalFilePath,FileName);

    fd=open(LocalFilePath,O_RDWR|O_CREAT,S_IREAD|S_IWRITE);
    if(fd>0)
    {
        memset(Buffer,0,BUFFER);
        read(Sock,&FileSize,sizeof(long));
        while(FileSize>BUFFER)
        {
            read(Sock,Buffer,BUFFER);
            write(fd,Buffer,BUFFER);
            FileSize-=BUFFER;
        }

        read(Sock,Buffer,FileSize);
        write(fd,Buffer,FileSize);
        close(fd);
        printf("Finished !\n");
    }
    else
    {
        printf("Open File Failed !\n");
    }

}


void put(int Sock,int SockMsg,char *FileName)
{
    char LocalFilePath[100];
    int fd;
    char Buffer[BUFFER];
    struct stat FileStat;
    long FileSize;

    write(SockMsg,UserCmd,sizeof(UserCmd));
    write(SockMsg,CmdArg,sizeof(CmdArg));

    memset(LocalFilePath,0,sizeof(LocalFilePath));
    getcwd(LocalFilePath,sizeof(LocalFilePath));
    strcat(LocalFilePath,"/");
    strcat(LocalFilePath,FileName);

    fd=open(LocalFilePath,O_RDONLY,S_IREAD);

    if(fd>0)
    {
        fstat(fd,&FileStat);
        FileSize=FileStat.st_size;

        write(Sock,&FileSize,sizeof(FileSize));
        memset(Buffer,0,BUFFER);
        while(FileSize>BUFFER)
        {
            read(fd,Buffer,BUFFER);
            write(Sock,Buffer,BUFFER);
            FileSize-=BUFFER;
        }

        read(fd,Buffer,FileSize);
        write(Sock,Buffer,FileSize);
        close(fd);
        printf("Finished !\n");
    }
    else
    {
        printf("Create %s Failed !\n");
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值