服务端
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include "sufei.h"
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <arpa/inet.h>
int get_cmd(char *cmd) // 信号处理
{
if(!strcmp("ls",cmd)) return LS; //
if(!strcmp("pwd",cmd)) return PWD;
if(!strcmp("quit",cmd)) return QUIT;
if(strstr(cmd,"cd")!=NULL) return CD;
if(strstr(cmd,"get")!=NULL) return GET;
if(strstr(cmd,"put")!=NULL) return PUT;
return 100;
}
char *dion_cmd(char *cmd) //信号分割
{
char *p=NULL;
p=strtok(cmd," ");
p=strtok(NULL," ");
return p;
}
void msg_handler(struct Msg msg,int acc_ip)
{
int ret;
char *file;
int fpfile;
char readBuf[1024];
printf("cmd:%s\n",msg.cmd);
ret=get_cmd(msg.cmd);
switch(ret){
case LS:
case PWD:
msg.num=0;
FILE *fp=popen(msg.cmd,"r");
memset(&msg,0,sizeof(msg));
fread(msg.data,sizeof(msg.data),1,fp);
write(acc_ip,&msg,sizeof(msg));
fclose(fp);
break;
case CD:
msg.num=1;
char *dir=dion_cmd(msg.cmd);
printf("Dir:%s\n",dir);
chdir(dir);
break;
case GET:
file=dion_cmd(msg.cmd);
if(access(file,F_OK)==-1){
strcpy(msg.data,"Do file");
write(acc_ip,&msg,sizeof(msg));
}else{
printf("file=%s\n",file);
msg.num=DOFILE;
fpfile=open(file,O_RDWR);
read(fpfile,readBuf,sizeof(readBuf));
close(fpfile);
strcpy(msg.data,readBuf);
write(acc_ip,&msg,sizeof(msg));
}
break;
case PUT:
file=dion_cmd(msg.cmd);
printf("%s\n",file);
fpfile=open(file,O_RDWR|O_CREAT,0666);
write(fpfile,msg.data,sizeof(msg.data));
close(fpfile);
break;
case QUIT:
printf("client out\n");
break;
}
}
int main (int argc,char **argv)
{
int soc_ip;
int acc_ip;
int n_read;
struct sockaddr_in soc_r;
struct sockaddr_in acc_t;
struct Msg msg;
soc_ip=socket(AF_INET,SOCK_STREAM,0);
soc_r.sin_family=AF_INET;
soc_r.sin_port=htons(atoi(argv[2]));
inet_aton(argv[1],&soc_r.sin_addr);
bind(soc_ip,(struct sockaddr*)&soc_r,sizeof(struct sockaddr_in));
int clen=sizeof(struct sockaddr_in);
listen(soc_ip,10);
while(1){
acc_ip=accept(soc_ip,(struct sockaddr*)&acc_t,&clen);
if(acc_ip==-1){
perror("accept");
exit(-1);
}else{
printf("Client access:%s\n",inet_ntoa(acc_t.sin_addr));
}
if(fork()==0){ //创建子进程去对接客户端
while(1){
n_read=read(acc_ip,&msg,sizeof(msg));
if(n_read==-1){
printf("client out\n");
break;
}else if(n_read>0){
msg_handler(msg,acc_ip);
}
}
}
}
close(soc_ip);
close(acc_ip);
return 0;
}
客户端
```c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include "sufei.h"
#include <fcntl.h>
#include <arpa/inet.h>
int get_cmd(char *cmd) //信号处理
{
if(!strcmp("ls",cmd)) return LS;
if(!strcmp("lls",cmd)) return LLS;
if(!strcmp("pwd",cmd)) return PWD;
if(!strcmp("quit",cmd)) return QUIT;
if(strstr(cmd,"lcd")) return LCD;
if(strstr(cmd,"cd")) return CD;
if(strstr(cmd,"get")) return GET;
if(strstr(cmd,"put")) return PUT;
return -1;
}
char *dion_cmd(char *cmd) // 信号分割
{
char *p=NULL;
p=strtok(cmd," ");
p=strtok(NULL," ");
return p;
}
int cmd_handler(struct Msg msg,int ip) //发送信号数据
{
int ret;
char *file;
int fp;
char buf[108];
ret=get_cmd(msg.cmd);
switch (ret){
case LS :
case PWD:
case CD :
msg.num=0;
write(ip,&msg,sizeof(msg));
break;
case GET:
msg.num=2;
write(ip,&msg,sizeof(msg));
break;
case PUT:
strcpy(buf,msg.cmd);
file=dion_cmd(buf);
if(access(file,F_OK)==-1){
printf("Do file\n");
}
fp=open(file,O_RDWR);
read(fp,msg.data,sizeof(msg.data));
close(fp);
write(ip,&msg,sizeof(msg));
break;
case LLS:
system("ls");
break;
case LCD:
file=dion_cmd(msg.cmd);
chdir(file);
break;
case QUIT:
write(ip,&msg,sizeof(msg));
exit(0);
break;
}
return ret;
}
void handler_server(struct Msg msg,int ip) // 读取数据
{
int n_read;
char *p;
int op_fd;
struct Msg msget;
memset(&msget,0,sizeof(msget));
n_read=read(ip,&msget,sizeof(msget));
if(msget.num==DOFILE){
p=dion_cmd(msg.cmd);
printf("%s\n",p);
op_fd=open(p,O_RDWR|O_CREAT,0600);
write(op_fd,msg.data,strlen(msg.data));
close(op_fd);
}else{
printf("--------------------------------\n");
printf("%s\n",msget.data);
printf("--------------------------------\n");
fflush(stdout);
}
}
int main (int argc,char **argv)
{
int soc_ip;
struct sockaddr_in soc_r;
struct Msg msg;
soc_ip=socket(AF_INET,SOCK_STREAM,0);
soc_r.sin_family=AF_INET;
soc_r.sin_port=htons(atoi(argv[2]));
inet_aton(argv[1],&soc_r.sin_addr);
if(connect(soc_ip,(struct sockaddr*)&soc_r,sizeof(struct sockaddr))==-1){
perror("connect");
exit(-1);
}else{
printf("conmect....\n");
}
while(1){
printf(">");
memset(&msg,0,sizeof(msg));
gets(msg.cmd);
int ret=cmd_handler(msg,soc_ip);
if(ret==-1){
printf("input NO OK\n");
continue;
}
if(ret>IFGO){
continue;
}
handler_server(msg,soc_ip);
}
return 0;
}
#define CD 10
#define LS 1
#define GET 2
#define PWD 3
#define IFGO 4
#define LCD 5
#define LLS 6
#define PUT 7
#define QUIT 8
#define DOFILE 9
struct Msg //结构体存放指令和数据
{
int num;
char cmd[128];
char data[1024];
};
本项目是学习时的项目,由于水平有限如有错误希望留言