服务端:
#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];
};