当前位置 博文首页 > c语言编写ftp客户端,Linux C语言模拟FTP服务器

    c语言编写ftp客户端,Linux C语言模拟FTP服务器

    作者:xiaoyingying 时间:2021-07-22 17:04

        实现的功能如下:
        功能大体上都能实现,代码的规范性,程序运行后文本的的格式还有待改善,可能还有一些尚未发现的bug,等日后有空再测试修改吧(明天开始上网课了-_-||)
        myftp.h
        #ifndef__MYFTP_H__
        #define__MYFTP_H__
        #include<sys/socket.h>
        #include<sys/types.h>
        #include<unistd.h>
        #include<sys/stat.h>
        #include<fcntl.h>
        #include<unistd.h>
        #defineERROR-1
        #defineLS0
        #defineCD1
        #definePWD2
        #defineGET3
        #definePUT4
        #defineMYLS5
        #defineMYPWD6
        #defineMYCD7
        typedefstructMessage{
        charcmd[128];
        charbuf[1024];
        charcontent[2048];
        }Msg;
        //Public=================================================================
        //Changecmdtonumber
        intcmd_change(Msgmsg){
        if(strstr(msg.cmd,"ls")!=NULL)
        returnLS;
        elseif(strstr(msg.cmd,"pwd")!=NULL)
        returnPWD;
        elseif(strstr(msg.cmd,"cd")!=NULL)
        returnCD;
        elseif(strstr(msg.cmd,"get")!=NULL)
        returnGET;
        elseif(strstr(msg.cmd,"put")!=NULL)
        returnPUT;
        elseif(strstr(msg.cmd,"LS")!=NULL)
        returnMYLS;
        elseif(strstr(msg.cmd,"PWD")!=NULL)
        returnMYPWD;
        elseif(strstr(msg.cmd,"CD")!=NULL)
        returnMYCD;
        elseif(strlen(msg.cmd)==0){}
        else{
        printf("Commend:%s(%ld)iswrong!\n\n",msg.cmd,strlen(msg.cmd));
        printf("-----------------------------\n\n");
        returnERROR;
        }
        }
        //-----------------------------------------------------------------------
        char*Get_file_name(Msgmsg){
        char*file;
        file=strtok(msg.cmd,"");
        file=strtok(NULL,"");
        file[strlen(file)-1]='\0';
        returnfile;
        }
        //----------------------------------------------------------------------
        voidServer_write_to_client(Msgmsg,intc_fd){
        char*file=Get_file_name(msg);
        memset(&msg,0,sizeof(msg));
        intfd=open(file,O_RDWR);
        intn_read=read(fd,msg.content,2048);
        if(n_read>=0){
        strcpy(msg.buf,"Serverwritetoclientsuccessfully!\n");
        intn_write=write(c_fd,&msg,sizeof(msg));
        if(n_write>0){
        printf("Sendsuccess!\n");
        }
        else{
        perror("why");
        }
        }
        else{
        perror("Server_write_to_client");
        strcpy(msg.buf,"Serverwritetoclientfailed!\n");
        write(c_fd,&msg,sizeof(msg));
        }
        }
        //----------------------------------------------------------------------
        voidClient_write_to_server(char*file,intc_fd){
        printf("client_file:%s\n",file);
        Msgmsg;
        memset(&msg,0,sizeof(msg));
        intfd=open(file,O_RDWR);
        intn_read=read(fd,msg.content,2048);
        if(n_read>0){
        printf("Clientwritetoserversuccessfully!\n");
        write(c_fd,&msg,sizeof(msg));
        }
        else{
        printf("Clientwritetoserverfailed!\n");
        }
        }
        //------------------------------------------------------------------------
        voidServer_listen_from_client(char*file,intc_fd){
        Msgmsg;
        memset(&msg,0,sizeof(msg));
        intn_read=read(c_fd,&msg,sizeof(msg));
        if(n_read>0){
        intfd=open(file,O_RDWR|O_CREAT,0600);
        if(fd>0){
        intn_write=write(fd,msg.content,strlen(msg.content));
        if(n_write>0){
        strcpy(msg.buf,"Serverlistenfromclientsuccessfully!\n");
        write(c_fd,&msg,sizeof(msg));
        }
        else{
        strcpy(msg.buf,"Serverlistenfromclientfailed!\n");
        write(c_fd,&msg,sizeof(msg));
        }
        }
        else{
        printf("file=%s\n",file);
        perror("Servercreatefilefailed!\n\n");
        }
        }
        else{
        printf("Serverreadpipefailed\n\n");
        }
        }
        //-----------------------------------------------------------------------
        voidClient_listen_from_server(char*filename,intc_fd){
        Msgmsg;
        memset(&msg,0,sizeof(msg));
        intn_read=read(c_fd,&msg,sizeof(msg));
        if(n_read>0){
        printf("Recvsuccess!\n");
        printf("content:\n%s\n",msg.content);
        printf("%ld:%s\n",strlen(filename),filename);
        intfd=open(filename,O_RDWR|O_CREAT,0600);
        if(fd>0){
        intn_write=write(fd,msg.content,strlen(msg.content));
        if(n_write>0){
        printf("Clientlistenfromserversuccessfully!\n");
        }
        else{
        printf("Clientlistenfromserverfailed!\n");
        }
        }
        else{
        printf("Clientlistenfromserverfailed!\n");
        }
        }
        else{
        perror("Recvfailed");
        }
        }
        //Server=================================================================
        //Server:handlecmd
        voidserver_cmd_handle(intc_fd,Msgmsg,intnum){
        if(num==LS){
        Msgmsg;
        FILE*fp=popen("ls","r");
        memset(&msg,0,sizeof(msg));
        intn_read=fread(msg.buf,1,2048,fp);
        if(n_read<=0){
        perror("Server_read");
        }
        else{
        write(c_fd,&msg,sizeof(msg));
        }
        }
        elseif(num==PWD){
        Msgmsg;
        FILE*fp=popen("pwd","r");
        memset(&msg,0,sizeof(msg));
        intn_read=fread(msg.buf,1,2048,fp);
        if(n_read<=0){
        perror("Server_read");
        }
        else{
        write(c_fd,&msg,sizeof(msg));
        }
        }
        elseif(num==CD){
        //1.getfilename
        char*file=Get_file_name(msg);
        //2.getallfile'snamewhichisintheserver
        FILE*fp=popen("ls","r");
        char*Rbuf=(char*)malloc(2048*sizeof(char));
        memset(Rbuf,0,2048);
        fread(Rbuf,1,2048,fp);
        fclose(fp);
        //3.checkifitexiits
        if(strstr(file,"..")!=NULL||strstr(Rbuf,file)!=NULL){
        intret=chdir(file);
        if(ret==0){
        char*buf="Success!\n";
        write(c_fd,buf,strlen(buf));
        }
        else{
        perror("Server_CD_chdir");
        exit(-1);
        }
        }
        else{
        char*buf="Fileisnotexist!";
        write(c_fd,buf,strlen(buf));
        exit(-1);
        }
        }
        elseif(num==GET){
        intn_read,n_write,fd;
        //1.getfilename
        char*file=Get_file_name(msg);
        printf("serverwanttoget%s\n\n",file);
        //2.getallfile'snamewhichisintheserver
        FILE*fp=popen("ls","r");
        char*Rbuf=(char*)malloc(2048*sizeof(char));
        fread(Rbuf,1,2048,fp);
        fclose(fp);
        //3.copyandsendtxt
        if(strstr(Rbuf,file)!=NULL){
        Server_write_to_client(msg,c_fd);
        }
        }
        elseif(num==PUT){
        char*file=Get_file_name(msg);
        printf("Clientput%s\n\n",file);
        char*filename;
        filename=(char*)malloc(20*sizeof(char));
        strcpy(filename,file);
        printf("Clientput%s\n\n",filename);
        Server_listen_from_client(filename,c_fd);
        }
        }
        //client======================================================
        //Client:handlecmd
        voidclient_cmd_handle(intc_fd,Msgmsg,intnum){
        if(num==MYLS){
        FILE*fp=popen("ls","r");
        char*Rbuf=(char*)malloc(2048*sizeof(char));
        memset(Rbuf,0,2048);
        intRtypes=fread(Rbuf,1,2048,fp);
        printf("\n%s\n------------------------------\n\n",Rbuf);
        pclose(fp);
        }
        elseif(num==MYPWD){
        FILE*fp=popen("pwd","r");
        char*Rbuf=(char*)malloc(2048*sizeof(char));
        memset(Rbuf,0,2048);
        intRtypes=fread(Rbuf,1,2048,fp);
        printf("\n%s\n------------------------------\n\n",Rbuf);
        pclose(fp);
        }
        elseif(num==MYCD){
        //1.getfilename
        char*file=Get_file_name(msg);
        //2.getallfile'snamewhichisintheclient
        FILE*fp=popen("ls","r");
        char*Rbuf=(char*)malloc(2048*sizeof(char));
        memset(Rbuf,0,2048);
        fread(Rbuf,1,2048,fp);
        fclose(fp);
        //3.checkifitexiits
        if(strstr(file,"..")!=NULL||strstr(Rbuf,file)!=NULL){
        intret=chdir(file);
        if(ret==0){
        printf("\nSuccess!\n\n------------------------------\n\n");
        }else{
        perror("Server_cd");
        exit(-1);
        }
        }else{
        printf("\nFileisnotexist!\n\n------------------------------\n\n");
        exit(-1);
        }
        }
        }
        #endif
        server.c
        #include<stdio.h>
        #include<stdio.h>
        #include<string.h>
        #include"myftp.h"
        #include<sys/types.h>/*SeeNOTES*/
        #include<sys/socket.h>
        #include
        #include<netinet/in.h>
        #include<unistd.h>
        #include<sys/stat.h>
        #include<fcntl.h>
        intmain(intargc,char**argv){
        ints_fd,c_fd,ret,c_len,fd,key;
        Msgmsg;
        structsockaddr_ins_addr;
        structsockaddr_inc_addr;
        memset(&s_addr,0,sizeof(structsockaddr_in));
        memset(&c_addr,0,sizeof(structsockaddr_in));
        if(argc!=2){
        printf("Paramwrong!\n");
        exit(-1);
        }
        //=============================================================================connext
        //socket
        s_fd=socket(AF_INET,SOCK_STREAM,0);
        if(s_fd==-1){
        perror("Server_socket");
        exit(-2);
        }
        //bind
        s_addr.sin_family=AF_INET;
        s_addr.sin_port=htons(atoi(argv[1]));
        inet_aton("192.168.95.130",&s_addr.sin_addr);
        ret=bind(s_fd,(structsockaddr*)&s_addr,sizeof(structsockaddr_in));
        if(ret==-1){
        perror("Server_bind");
        exit(-3);
        }
        //listen
        listen(s_fd,10);
        //accept
        c_len=sizeof(structsockaddr_in);
        c_fd=accept(s_fd,(structsockaddr*)&c_addr,&c_len);
        if(c_fd==-1){
        perror("Server_accept");
        exit(-4);
        }else{
        printf("-------------------------------------\n\n");
        printf("%sconnected\n\n",inet_ntoa(c_addr.sin_addr));
        printf("-------------------------------------\n\n");
        }
        //=============================================================================work
        //while{
        while(1){
        memset(&msg,0,sizeof(msg));
        intn_read=read(c_fd,&msg,sizeof(msg));
        printf("read:%s\n",msg.cmd);
        //handlekey
        key=cmd_change(msg);
        server_cmd_handle(c_fd,msg,key);
        }
        return0;
        }
        client.c
        #include<stdio.h>
        #include<stdlib.h>
        #include<string.h>
        #include"myftp.h"
        #include<sys/types.h>/*SeeNOTES*/
        #include<sys/socket.h>
        #include
        #include<netinet/in.h>
        #include<unistd.h>
        #include<fcntl.h>
        intmain(intarc,char**argv){
        intc_fd,fd,key;
        Msgmsg;
        char*file=NULL;
        structsockaddr_inc_addr;
        memset(&c_addr,0,sizeof(structsockaddr_in));
        if(arc!=3){
        printf("Paramwrong!\n");
        exit(-1);
        }
        //=================================================================================================connect
        //socket
        c_fd=socket(AF_INET,SOCK_STREAM,0);
        if(c_fd==-1){
        perror("Client_socket");
        exit(-2);
        }
        //connect
        c_addr.sin_family=AF_INET;
        c_addr.sin_port=htons(atoi(argv[2]));
        inet_aton(argv[1],&c_addr.sin_addr);
        intret=connect(c_fd,(structsockaddr*)&c_addr,sizeof(structsockaddr_in));
        if(ret==-1){
        perror("Client_connect");
        exit(-3);
        }else{
        printf("-------------------------------------\n\n");
        printf("Connectedsuccessfully!\n\n");
        printf("-------------------------------------\n\n");
        }
        //==================================================================================================work
        //while(){
        while(1){
        fd=fork();
        //sendmsg
        if(fd==0){
        while(1){
        printf(">");
        memset(&msg,0,sizeof(msg));
        fgets(msg.cmd,128,stdin);
        key=cmd_change(msg);
        if(key==CD||key==GET||key==PUT||key==MYCD){
        char*filename=Get_file_name(msg);
        file=(char*)malloc(20*sizeof(char));
        strcpy(file,filename);
        }
        if(key<5&&key>=0){
        intn_write=write(c_fd,&msg,sizeof(msg));
        if(key==PUT){
        Client_write_to_server(file,c_fd);
        }
        elseif(key==GET){
        Client_listen_from_server(file,c_fd);
        }
        }
        elseif(key>=5){
        client_cmd_handle(c_fd,msg,key);
        }
        else
        continue;
        }
        }
        while(1){
        //recvmsg
        memset(msg.buf,0,strlen(msg.buf));
        intn_read=read(c_fd,&msg,sizeof(msg));
        printf("\n%s\n",msg.buf);
        printf("-------------------------------------\n\n");
        }
        }
        return0;
        }
        原文链接:https://blog.csdn.net/ChrisKevin0221/article/details/114228726