linux文件服务站

定义一些命令的宏

config.h

#define LS 0
#define GET 1
#define PWD 2
#define IFGO 3
#define LLs 4
#define LCD 5
#define CD  6
#define PUT 7

#define QUIT 8
#define DOFILE 9


struct read
{

	char data[1024]; 
	int cmd;   // 定义标记符号
	char buf[32];

};

服务端server

server.h

#ifndef __SERVER_H
#define __SERVER_H

//函数声明
int get_cmd_lh(char *cmd);
char *getdir(char *cdg);
void readbuf_hand(struct read readbuf,int fd);

#endif

server.c

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

int main(int argc, char **argv)
{
	int n_read;
	int s_fd;
	int c_fd;
	struct sockaddr_in s_addr;
	struct sockaddr_in c_addr;
	struct read readbuf;
	memset(&c_addr,0,sizeof(struct sockaddr_in));
	memset(&s_addr,0,sizeof(struct sockaddr_in));
	s_fd = socket(AF_INET,SOCK_STREAM ,0);  
	if(s_fd==-1){

		perror("socket");
		exit(-1);

	}
	if(argc !=3){

		printf("get quit\n");
		exit(-1);
	}    

	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));  // 设置ip地址 

	listen(s_fd,10);  //监听 
	int clen=sizeof(struct sockaddr_in);

	while(1){
           //等待客户端连接 
		c_fd=accept(s_fd,(struct sockaddr *)&c_addr,&clen);     
		if(c_fd==-1){
			perror("accept");
			exit(-1);
		}
		printf("get connect:%s\n",inet_ntoa(c_addr.sin_addr));

		if(fork()==0){

			while(1){
				memset(readbuf.data,0,sizeof(readbuf.data));
				n_read=read(c_fd,&readbuf,sizeof(readbuf));   //读取客户端发来的数据        
				if(n_read==0){
					printf("client over\n");
					exit(-1);

				} else if(n_read>0){

					readbuf_hand(readbuf,c_fd);
				}



			}

		}

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


}

int get_cmd_lh(char *cmd)   //判断输入指令 
{
	if(!strcmp("ls",cmd))             return LS;
	if(!strcmp("quit",cmd))           return QUIT;
	if(!strcmp("pwd",cmd))            return PWD;

	if(strstr(cmd,"put")!=NULL)    return PUT;
	if(strstr(cmd,"get")!=NULL)    return GET;
	if(strstr(cmd,"cd")!=NULL)     return CD;



	return 99;


}

char *getdir(char *cdg)  //分割 
{

	char *p;
	p=strtok(cdg," ");
	p=strtok(NULL," ");

	return p;

}



void readbuf_hand(struct read readbuf,int fd)   //读输入的指令  执行那个语句 

{
	char *file=NULL;
	int filefd;
	char lhbuf[1024]= {0};
	printf("cmd:%s\n",readbuf.data);  //服务端显示读取的客户端命令

	int rng=get_cmd_lh(readbuf.data);  //判断是哪个指令 
	
 //对返回的指令进行选择执行
	switch(rng){
		case LS:         
		case PWD:
			readbuf.cmd=0;
			FILE *t=popen(readbuf.data,"r");
			fread(readbuf.data,sizeof(readbuf.data),1,t);       
			write(fd,&readbuf,sizeof(readbuf));
			break;

		case GET:

			file=getdir(readbuf.data);
			if(access(file,F_OK)==-1){

				strcpy(readbuf.data,"NO this flie");
				write(fd,&readbuf,sizeof(readbuf));

			}else{
				readbuf.cmd=DOFILE;
				filefd=open(file,O_RDWR);
				read(filefd,lhbuf,sizeof(lhbuf));
				close(filefd);

				strcpy(readbuf.data,lhbuf);
				write(fd,&readbuf,sizeof(readbuf)); 

			}
			break;     

		case CD:

			readbuf.cmd=1;  
			char *dir=getdir(readbuf.data);
			printf("dir :%s\n",dir);
			chdir(dir);
			break;

		case PUT:

			filefd=open(getdir(readbuf.data),O_RDWR|O_CREAT,0666);
			write(filefd,readbuf.buf,strlen(readbuf.buf));
			close(filefd);
			break;

		case QUIT:

			printf("client quit\n");
			exit(-1);

	}


}

客户端client

client.h

#ifndef __CLIENT_H
#define __CLIENT_H

//函数声明
char *putdir(char *cdg);
int put_cmd_lh(char *cmd);
int client_cmd_handler(struct read readbuf,int fd);
void hand_server(int fd, struct read readbuf);

#endif

client.c

#include <stdio.h>
#include <sys/types.h>         
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "config.h"
#include "client.h"
int main(int argc, char **argv)

{
	int s_fd;
	int c_fd;

	struct sockaddr_in c_addr;
	struct read readbuf;
	memset(&c_addr,0,sizeof(struct sockaddr_in));
	s_fd=socket(AF_INET,SOCK_STREAM ,0);
	if(s_fd==-1){

		perror("socket");
		exit(-1);

	}

               if(argc !=3){

                printf("param is not good\n");
                exit(-1);

        }


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


	c_fd=connect(s_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr_in));
	if(c_fd==-1){
		printf("connect quit\n");
		exit(-1);

	}
	while(1){
		memset(readbuf.data,0,sizeof(readbuf.data)); 
		gets(readbuf.data);  //输入指令

 		int ret=client_cmd_handler(readbuf,s_fd); // 把指令进行分类处理
                  if(ret>IFGO){
                        fflush(stdout);
                        continue;

                }

		if(ret==-1){
			printf("connect over\n");

			fflush(stdout);
			continue;

		}
		hand_server(s_fd,readbuf);
	}

	return 0;
}

char *putdir(char *cdg)
{

	char *p;
	p=strtok(cdg," ");
	p=strtok(NULL," ");

	return p;

}


int put_cmd_lh(char *cmd)
{
	if(strstr(cmd,"lcd"))          return LCD;

	if(!strcmp("ls",cmd))          return LS;
	if(!strcmp("lls",cmd))         return LLS;
	if(!strcmp("quit",cmd))        return QUIT;
	if(!strcmp("pwd",cmd))         return LS;
	if(strstr(cmd,"put"))          return PUT;
	if(strstr(cmd,"get"))          return GET;
	if(strstr(cmd,"cd"))           return CD;


	return -1;




}


int client_cmd_handler(struct read readbuf,int fd)

{   
	char but[64];
	char*file=NULL;   
	int filefd;
	int edg=put_cmd_lh(readbuf.data);  

	switch(edg){

		case LS:
		case CD:
		case PWD:
			readbuf.cmd=0;
			write(fd,&readbuf,sizeof(readbuf));
			break;

		case GET:  
			readbuf.cmd=2;
			write(fd,&readbuf,sizeof(readbuf));
		        break;

		case PUT:
			strcpy(but,readbuf.data);
			file=getdir(but);  

          		  if (access(file,F_OK)==-1){

	           		printf("%s not exits\n",file);

       			} else {

		        	filefd=open(file,O_RDWR);
				read(filefd,readbuf.buf,sizeof(readbuf.buf));
				close(filefd);

				write(fd,&readbuf,sizeof(readbuf));

				}               
				break;

       		case LLS:
			system("ls");
			break;

		case LCD:
			file=getdir(but);
			chdir(file);
			break;     

		case QUIT: 
			strcpy(readbuf.data,"quit");
			write(fd,&readbuf,sizeof(readbuf));
			close(fd);
			exit(-1);                   


	}
	return edg;

} 

 void hand_server(int fd, struct read readbuf)
{
   
        int nread;
        struct read readbut;
        int newfilefd;

        nread=read(fd,&readbut,sizeof(readbut));
        if(nread==0){

                printf("server is qiut\n");
                exit(-1);
        }

        else if(readbut.cmd==DOFILE){

                char *n=getdir(readbuf.data);
                newfilefd=open(n,O_RDWR|O_CREAT,0600);
                write(newfilefd,readbut.data,strlen(readbut.data));
                fflush(stdout);

        }

      else{

                printf("======================\n");
                printf("\n%s\n",readbut.data);
                printf("======================\n");

                fflush(stdout);


        }


}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值