FTP网盘小demo

服务端:

#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdlib.h>
//#include<linux/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include<string.h>
#include <unistd.h>
#include"Msg.h"
#include <sys/stat.h>
#include <fcntl.h>

int msg_type(char *cmd)
{
        if(!strcmp("ls",cmd)){
                return LS;
        }
        if(!strcmp("pwd",cmd)){
                return PWD;
        }
        if(strstr(cmd,"cd")!=NULL){
                return CD;
        }
        if(strstr(cmd,"get")!=NULL){
                return GET;
        }
        if(strstr(cmd,"put")!=NULL){
                return PUT;
        }
        return -1;
}
char *get_dir(char *dir_cmd)
{
        char *dir;
        dir=strtok(dir_cmd," ");
        dir=strtok(NULL," ");
        return dir;
}
void msg_handler(struct Msg msg,int fd)
{
        int ret;
        FILE *date;
        char *dir;
        char readbuf[1024]={0};
        int sfd;
        printf("cmd:%s\n",msg.cmd);
        ret = msg_type(msg.cmd);
        switch(ret){
                case LS:
                case PWD:
                        date=popen(msg.cmd,"r");
                        fread(msg.cmd,sizeof(msg),1,date);
                        write(fd,&msg,sizeof(msg));
                break;
                case CD:
                        dir=get_dir(msg.cmd);
                        printf("dir:%s\n",dir);
                        chdir(dir);
                break;
                case GET:

                        if(access(get_dir(msg.cmd),F_OK)==-1){
                                strcpy(msg.cmd,"no this file");
                                write(fd,&msg,sizeof(msg));
                        }else{
                                msg.get=RUN;
                                int filefd=open(get_dir(msg.cmd),O_RDWR);
                                read(filefd,readbuf,sizeof(readbuf));
                                strcpy(msg.cmd,readbuf);
                                write(fd,&msg,sizeof(msg));
                                close(filefd);

                        }
                break;
  				case PUT:
                        dir=get_dir(msg.cmd);
                        sfd=open(dir,O_RDWR|O_CREAT|0600);
                        write(sfd,msg.sendBuf,sizeof(msg.sendBuf));
                        close(sfd);
                break;
                case QUIT:
                        printf("client quit\n");
                        exit(0);
                break;
        }

}
int main(int argc,char ** argv)
{
        if(argc<3){
                printf("wrong parameter\n");
                exit(-1);
        }
        int s_fd;
        int c_fd;
        int nread;
        struct sockaddr_in s_con;
        struct sockaddr_in c_con;
        struct Msg msg;
        int size=sizeof(struct sockaddr_in);
        memset(&s_con,0,size);
        memset(&c_con,0,size);
        s_fd=socket(AF_INET,SOCK_STREAM,0);
        if(s_fd==-1){
                perror("socket");
                exit(-1);
        }
        s_con.sin_family=AF_INET; //configure agreement
        s_con.sin_port=htons(atoi(argv[2]));// configure port number
        inet_aton(argv[1],&s_con.sin_addr);     //configure IP adress

        if(bind(s_fd,(struct sockaddr *)&s_con,sizeof(struct sockaddr_in))==-1){
                perror("bind");
                exit(-1);
        }
        if(listen(s_fd,5)==-1){
                perror("listen");
        }
 		while(1){
                        c_fd=accept(s_fd,(struct sockaddr *)&c_con,&size);
                        if(c_fd==-1){
                                perror("accept");
                                exit(-1);
                        }
                        printf("ID:%s\n",inet_ntoa(c_con.sin_addr));
                        if(fork()==0){
                                while(1){
                                        memset(&msg.cmd,0,sizeof(msg.cmd));
                                        nread=read(c_fd,&msg,sizeof(msg));
                                        if(nread==0){
                                                printf("client quit\n");
                                                exit(0);
                                        }
                                        else if(nread>0){
                                                msg_handler(msg,c_fd);

                                        }
                                }

                        }
        }
        close(c_fd);
        close(s_fd);
        return 0;
}
                                               

客户端:

#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdlib.h>
//#include<linux/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include<string.h>
#include"Msg.h"
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>

char *get_dir(char *dir_cmd)
{
        char *dir;
        dir=strtok(dir_cmd," ");
        dir=strtok(NULL," ");
        return dir;
}

void serval_handler(struct Msg msg,int fd)
{
        int nread;
        struct Msg text;
        int filefd;
        nread=read(fd,&text,sizeof(text));
        if(nread==0){
                printf("serval quit\n");
                exit(-1);
        }else if(text.get==RUN){
                filefd=open(get_dir(msg.cmd),O_RDWR|O_CREAT|0600);
                write(filefd,&text.cmd,strlen(text.cmd));
                close(filefd);

        }
        else{
                printf("---------------------------\n");
                printf("\n%s\n",text.cmd);
                printf("---------------------------\n");
        }
}
int cmd_type(char *cmd)
{
        if(!strcmp("ls",cmd)){
                return LS;
        }
        if(!strcmp("pwd",cmd)){
                return PWD;
        }
        if(!strcmp("lls",cmd)){
                return LLS;
        }
        if(!strcmp("quit",cmd)){
                return QUIT;
        }
        if(strstr(cmd,"lcd")!=NULL){
                return LCD;
        }
        if(strstr(cmd,"cd")!=NULL){
                return CD;
        }
        if(strstr(cmd,"get")!=NULL){
                return GET;
        }
        if(strstr(cmd,"put")!=NULL){
                return PUT;
        }
        return -1;

}
int cmd_handler(struct Msg msg,int fd)
{
        int ret1;
        char *dir;
        ret1=cmd_type(msg.cmd);
        int cfilefd;
        char readbuf[1024]={0};
        char buf[50];
        switch(ret1){
                case LS:
                case CD:
                case PWD:
                case GET:
                        write(fd,&msg,sizeof(msg));
                        break;
                case LLS:
                        system("ls");
                        break;
                case LCD:
                        dir=get_dir(msg.cmd);
                        printf("dir:%s\n",dir);
                        chdir(dir);
                        break;
 case PUT:
                        strcpy(buf,msg.cmd);
                        dir=get_dir(buf);
                        if(access(dir,F_OK)==-1){
                                printf("client: no this file\n");
                        }else{
                                cfilefd=open(dir,O_RDWR);
                                if(cfilefd==-1){
                                        perror("open");
                                }
                                if(read(cfilefd,readbuf,sizeof(readbuf))==-1){
                                        perror("read");
                                }
                                strcpy(msg.sendBuf,readbuf);
                                if(write(fd,&msg,sizeof(msg))==-1){
                                        perror("write");
                                }
                                close(cfilefd);
                        }
                break;
                case QUIT:
                        strcpy(msg.cmd,"quit");
                        write(fd,&msg,sizeof(msg));
                        close(fd);
                        exit(-1);
        }
        return ret1;

}
int main(int argc,char ** argv)
{

        if(argc<3){
                printf("wrong parameter\n");
                exit(-1);
        }
        int c_fd;
        int ret;
        struct sockaddr_in c_con;
        struct Msg msg;
        int size=sizeof(struct sockaddr_in);
        memset(&c_con,0,size);
        memset(&msg,0,sizeof(msg));
        c_fd=socket(AF_INET,SOCK_STREAM,0);
        if(c_fd==-1){
                perror("socket");
                exit(-1);
        }
        c_con.sin_family=AF_INET; //configure agreement
        c_con.sin_port=htons(atoi(argv[2]));// configure port number
        inet_aton(argv[1],&c_con.sin_addr);     //configure IP adress

        if(connect(c_fd,(struct sockaddr *)&c_con,size)==-1){
                perror("connect");
                exit(-1);
        }
                printf("connect..\n");
        while(1){
                memset(&msg.cmd,0,sizeof(msg.cmd));
                gets(msg.cmd);
                ret = cmd_handler(msg,c_fd);
                if(ret ==-1){
                        printf("no this cmd\n");
                }
                else if(ret < Y){
                        serval_handler(msg,c_fd);
                }
        }
        return 0;
}

Msg.h头文件:

#define LS   0
#define GET  1
#define PWD  2
#define Y    3
#define CD   4
#define PUT  5
#define LLS  6
#define LCD  7
#define QUIT 8
#define RUN  9
struct Msg
{
        int get;
        char cmd[1024];
        char sendBuf[128];
};


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值