ftp

server.c

#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>          /* See NOTES */
#include <string.h>
#include <sys/socket.h>
//#include <linux/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#define LLS       1
#define LPWD      2
#define LCD       3

#define CD       4
#define LS       5
#define PWD     6

#define PUT      7
#define GET      8
#define QUIT     9

int change(char * readbuf)
{
        if(!strcmp("ls",readbuf))  return LS;
        if(!strcmp("quit",readbuf))  return QUIT;
        if(!strcmp("pwd",readbuf))  return PWD;
        if(strstr(readbuf,"cd") != NULL)  return CD;
        if(strstr(readbuf,"get") !=NULL)  return GET;
        if(strstr(readbuf,"put") != NULL)  return PUT;
return -1;
}
char *getdesdir(char *msg)
{
        char *p;
        p = strtok(msg," ");
        p = strtok(NULL," ");
        return p;

}
int  msgprocess(char *readbuf,int c_fd)
{
        char buf[128] = {0};
        char secondbuf[10240] = {0};
        char *getmsg = NULL;
        int size;
        int nread;
        int nwrite;
        FILE *r = NULL;
        char *dir = NULL;
        int fdfile;
        int ret = change(readbuf);
//      printf("3.ret =%d \n",ret);     
//      printf("4.cmd :%s\n",readbuf);
        switch(ret){

                case LS:
                case PWD:
                        r = popen(readbuf,"r");
                        fread(buf,1,128,r);
                        int nwrite = write(c_fd,buf,sizeof(buf));
                        break;
                case QUIT:
                        printf("client quit!\n");
                        exit(-1);
                case CD:
                        dir = getdesdir(readbuf);
//                      printf("%s\n",dir);
                        if(access(dir,F_OK) == -1){
                                strcpy(buf,"No This File\n");
                                write(c_fd,buf,sizeof(buf));
                                exit(-1);
                        }
                        chdir(dir);
                        break;
                case GET:
                        dir = getdesdir(readbuf);
//                      printf("%s\n",dir);                     
                        if(access(dir,F_OK) == -1){
                                strcpy(buf,"No This File\n");
                                write(c_fd,buf,sizeof(buf));
                        }else{
                        //      memset(getmsg,0,sizeof(getmsg));        
                                fdfile = open(dir,O_RDWR);
                                size = lseek(fdfile,0,SEEK_END);
                //              printf("5.%d\n",size);
                                getmsg = (char *)malloc(sizeof(char)*size+1);
                                lseek(fdfile,0,SEEK_SET);
                                read(fdfile,getmsg,size);
                                close(fdfile);

                                nwrite = write(c_fd,getmsg,size);
                                if(nwrite > 0){
                                printf("send over!\n");
                                }
                                free(getmsg);
                        }
                        break;
                case PUT:
                        dir = getdesdir(readbuf);
//                      printf("1.dir = %s",dir);
                        fdfile = open(dir,O_RDWR|O_CREAT,0600);
                        nread = read(c_fd,secondbuf,sizeof(secondbuf));
                        nwrite = write(fdfile,secondbuf,nread);
                        close(fdfile);
                        if(nwrite > 0){
                                printf("get over!\n");
                        }
                        break;

        }
        return ret;
}
int main(int argc , char **argv)
{
        //1 socket
        int s_fd;
        int nread;
        int nwrite;
        int len;
        int ret;
        int c_fd;
        int mark = 0;

        struct sockaddr_in s_addr;
        struct sockaddr_in c_addr;

        char readbuf[128];
        char msg[128] = {0};

        memset(&s_addr,0,sizeof(struct sockaddr_in));
        memset(&c_addr,0,sizeof(struct sockaddr_in));

        s_fd = socket(AF_INET,SOCK_STREAM,0);
        if(s_fd == -1){
                perror("socket error:");
                exit(-1);
            }

        //2 bind
        s_addr.sin_family = AF_INET;
        s_addr.sin_port = htons(atoi(argv[2]));
        inet_aton(argv[1],&s_addr.sin_addr);
        bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
        //3.listen
        listen(s_fd,10);
        //4.accept`:
        len = sizeof(struct sockaddr_in);
        printf("wait client connecct ...\n");
        while(1){
                c_fd = accept(s_fd,(struct sockaddr *)&c_addr,&len);
                if(c_fd == -1){
                        perror("accept");
                        exit(-1);
                }
                mark++;
                //read
                printf("client connect\n");
        //      printf("get msg %s\n",inet_ntoa(c_addr.sin_addr));      
                if(fork() == 0){
                        //write
                        while(1){
                                memset(&readbuf,0,sizeof(readbuf));
                                nread = read(c_fd,readbuf,128);
                                        printf("%s\n",readbuf);
                                //      printf("2.%d\n",nread);
                                if(nread == 0){
                                        printf("client out\n");
                                        break;
                                }else if(nread > 0){

                                      ret = msgprocess(readbuf,c_fd);
                                      if(ret == PUT){
                                                continue;
                                        }
                                }
                         }
                }
        }
        close(c_fd);
        close(s_fd);
//      while(1);
        return 0;
}
                               
                    

client.c

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <string.h>
#include <sys/socket.h>
//#include <linux/in.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#define LLS       1
#define LPWD      2
#define LCD       3

#define CD       4
#define LS       5
#define PWD     6

#define PUT      7
#define GET      8
#define QUIT     9
int change(char *readbuf)
{
        if(!strcmp("ls",readbuf))  return LS;
        if(!strcmp("lls",readbuf))  return LLS;
        if(!strcmp("quit",readbuf))  return QUIT;
        if(!strcmp("pwd",readbuf))  return PWD;
        if(!strcmp("lpwd",readbuf))  return LPWD;
        if(strstr(readbuf,"lcd") != NULL)  return LCD;
        if(strstr(readbuf,"cd") != NULL)  return CD;
        if(strstr(readbuf,"get") !=NULL)  return GET;
        if(strstr(readbuf,"put") != NULL)  return PUT;
        return -1;
}
char *getdesdir(char *msg)
{
        char *p;
        p = strtok(msg," ");
        p = strtok(NULL," ");
        return p;

}
int cmdhander(char msg[128],int c_fd)
{
        int nwrite;
        int nread;
        int size;
        //char buf[1024] = {0};
        char *dir = NULL;
        int fdfile;
        int ret = change(msg);
//      printf("2.%d\n",ret);
//      printf("3.%s\n",msg);

        switch(ret){
                case LS:
                case PWD:
                        write(c_fd,msg,sizeof(msg));
//                      printf("mag = %s\n",msg);
                        break;
                case CD:
                        write(c_fd,msg,sizeof(msg));
//                      read(c_fd,secondbuf,sizeof(secondbuf));
//                      printf("%s\n",secondbuf);
                        break;
                case QUIT:
                        strcpy(msg,"quit");
                        write(c_fd,msg,sizeof(msg));
                        close(c_fd);
                        exit(-1);
                case LLS:
                        system("ls");
                        break;
                case LPWD:
                        system("pwd");
                        break;
                case GET:
                        nwrite = write(c_fd,msg,strlen(msg));
        //      printf("5.%s\n",msg);
        //      printf("6.%d\n",nwrite);
        //      printf("7.%ld\n",strlen(msg));

                        break;

                case PUT:
                        write(c_fd,msg,strlen(msg));
                        break;
                case LCD:
                        dir = getdesdir(msg);
                //      printf("%s\n",dir);
                        chdir(dir);
                        break;


        }
        return ret;
}
void putmsg(char *msg,int c_fd,int ret) ///发文件 
{

        char *secondbuf = NULL;

        int fdfile = open(getdesdir(msg),O_RDWR);

        if(fdfile == -1){
               printf("No This File\n");
             }else{
               int size = lseek(fdfile,0,SEEK_END);
                //      printf("4.%d\n",size);
               lseek(fdfile,0,SEEK_SET);
               secondbuf = malloc(sizeof(char)*size+1);
               int nread =	read(fdfile,secondbuf,size);
                //      printf("5.%d\n",nread);
               int nwrite = write(c_fd,secondbuf,size);
                //      printf("6.%d\n",nwrite);
               close(fdfile);
		 }



}
int getmsg(char *msg,int c_fd,int ret)  //从服务器获得信息
{
        char getmsg[10240] = {0};
        int nwrite;

                char *dir = NULL;
//      int ret = cmdhander(msg,c_fd);
        if(ret == PUT){
                return PUT;
        }
        int nread = read(c_fd,getmsg,sizeof(getmsg));
                //:     printf("8.raed = %d\n",nread);
        if(nread == 0){
                        printf("error");
                        exit(-1);
        }else if(ret == GET){                 //获取文件
                        dir = getdesdir(msg);
//              printf("4.%s\n",dir);
                        int fdfile = open(dir,O_RDWR|O_CREAT,0600);
                        //printf("fdfile%d\n",fdfile);
                        //read(c_fd,getmsg,sizeof(getmsg));     
                        //printf("8.read = %d\n",nread);
                        nwrite = write(fdfile,getmsg,nread);
//                      printf("9.write = %d\n",nwrite);
                        //memset(getmsg,0,sizeof(getmsg));
                        close(fdfile);
        }
        else    printf("%s",getmsg);
        return ret;
}

int main(int argc , char **argv)
{
        //1 socket
        int c_fd;
        int nwrite;
        char msg[128] = {0};

        struct sockaddr_in c_addr;

        char readbuf[128];

        if(argc != 3){
                perror("error");
                exit(-1);
        }

        memset(&c_addr,0,sizeof(struct sockaddr_in));

        //1.socket
        c_fd = socket(AF_INET,SOCK_STREAM,0);
        if(c_fd == -1){
                perror("socket error:");
                exit(-1);
        }

        //2.connect
        c_addr.sin_family = AF_INET;
        c_addr.sin_port = htons(atoi(argv[2]));
        inet_aton(argv[1],&c_addr.sin_addr);

                if(connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr)) == -1){
                        perror("error");
                        exit(-1);

                }else
                printf("connect...\n");

        while(1){
                        memset(&msg,0,sizeof(msg));
                        printf("input cmd: ");
                        gets(msg);
                //      msghander(msg,c_fd);
                //      printf("%s\n",msg);
                        int ret = cmdhander(msg,c_fd);

                        if(ret == -1){
                        printf("conmand not\n");
                        continue;
                }
                        if(ret <= 4){    
//                              printf(">");
                                continue;
                }
                        if(ret == PUT){
                        putmsg(msg,c_fd,ret);
                }else
               			getmsg(msg,c_fd,ret);
        }
        close(c_fd);
        return 0;
}
          
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值