定义一些命令的宏
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);
}
}