server.c
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h> /* See NOTES */
#include <string.h>
#include <sys/socket.h>
//#include <linux/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#define LLS 1
#define LPWD 2
#define LCD 3
#define CD 4
#define LS 5
#define PWD 6
#define PUT 7
#define GET 8
#define QUIT 9
int change(char * readbuf)
{
if(!strcmp("ls",readbuf)) return LS;
if(!strcmp("quit",readbuf)) return QUIT;
if(!strcmp("pwd",readbuf)) return PWD;
if(strstr(readbuf,"cd") != NULL) return CD;
if(strstr(readbuf,"get") !=NULL) return GET;
if(strstr(readbuf,"put") != NULL) return PUT;
return -1;
}
char *getdesdir(char *msg)
{
char *p;
p = strtok(msg," ");
p = strtok(NULL," ");
return p;
}
int msgprocess(char *readbuf,int c_fd)
{
char buf[128] = {0};
char secondbuf[10240] = {0};
char *getmsg = NULL;
int size;
int nread;
int nwrite;
FILE *r = NULL;
char *dir = NULL;
int fdfile;
int ret = change(readbuf);
// printf("3.ret =%d \n",ret);
// printf("4.cmd :%s\n",readbuf);
switch(ret){
case LS:
case PWD:
r = popen(readbuf,"r");
fread(buf,1,128,r);
int nwrite = write(c_fd,buf,sizeof(buf));
break;
case QUIT:
printf("client quit!\n");
exit(-1);
case CD:
dir = getdesdir(readbuf);
// printf("%s\n",dir);
if(access(dir,F_OK) == -1){
strcpy(buf,"No This File\n");
write(c_fd,buf,sizeof(buf));
exit(-1);
}
chdir(dir);
break;
case GET:
dir = getdesdir(readbuf);
// printf("%s\n",dir);
if(access(dir,F_OK) == -1){
strcpy(buf,"No This File\n");
write(c_fd,buf,sizeof(buf));
}else{
// memset(getmsg,0,sizeof(getmsg));
fdfile = open(dir,O_RDWR);
size = lseek(fdfile,0,SEEK_END);
// printf("5.%d\n",size);
getmsg = (char *)malloc(sizeof(char)*size+1);
lseek(fdfile,0,SEEK_SET);
read(fdfile,getmsg,size);
close(fdfile);
nwrite = write(c_fd,getmsg,size);
if(nwrite > 0){
printf("send over!\n");
}
free(getmsg);
}
break;
case PUT:
dir = getdesdir(readbuf);
// printf("1.dir = %s",dir);
fdfile = open(dir,O_RDWR|O_CREAT,0600);
nread = read(c_fd,secondbuf,sizeof(secondbuf));
nwrite = write(fdfile,secondbuf,nread);
close(fdfile);
if(nwrite > 0){
printf("get over!\n");
}
break;
}
return ret;
}
int main(int argc , char **argv)
{
//1 socket
int s_fd;
int nread;
int nwrite;
int len;
int ret;
int c_fd;
int mark = 0;
struct sockaddr_in s_addr;
struct sockaddr_in c_addr;
char readbuf[128];
char msg[128] = {0};
memset(&s_addr,0,sizeof(struct sockaddr_in));
memset(&c_addr,0,sizeof(struct sockaddr_in));
s_fd = socket(AF_INET,SOCK_STREAM,0);
if(s_fd == -1){
perror("socket error:");
exit(-1);
}
//2 bind
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));
//3.listen
listen(s_fd,10);
//4.accept`:
len = sizeof(struct sockaddr_in);
printf("wait client connecct ...\n");
while(1){
c_fd = accept(s_fd,(struct sockaddr *)&c_addr,&len);
if(c_fd == -1){
perror("accept");
exit(-1);
}
mark++;
//read
printf("client connect\n");
// printf("get msg %s\n",inet_ntoa(c_addr.sin_addr));
if(fork() == 0){
//write
while(1){
memset(&readbuf,0,sizeof(readbuf));
nread = read(c_fd,readbuf,128);
printf("%s\n",readbuf);
// printf("2.%d\n",nread);
if(nread == 0){
printf("client out\n");
break;
}else if(nread > 0){
ret = msgprocess(readbuf,c_fd);
if(ret == PUT){
continue;
}
}
}
}
}
close(c_fd);
close(s_fd);
// while(1);
return 0;
}
client.c
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <string.h>
#include <sys/socket.h>
//#include <linux/in.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#define LLS 1
#define LPWD 2
#define LCD 3
#define CD 4
#define LS 5
#define PWD 6
#define PUT 7
#define GET 8
#define QUIT 9
int change(char *readbuf)
{
if(!strcmp("ls",readbuf)) return LS;
if(!strcmp("lls",readbuf)) return LLS;
if(!strcmp("quit",readbuf)) return QUIT;
if(!strcmp("pwd",readbuf)) return PWD;
if(!strcmp("lpwd",readbuf)) return LPWD;
if(strstr(readbuf,"lcd") != NULL) return LCD;
if(strstr(readbuf,"cd") != NULL) return CD;
if(strstr(readbuf,"get") !=NULL) return GET;
if(strstr(readbuf,"put") != NULL) return PUT;
return -1;
}
char *getdesdir(char *msg)
{
char *p;
p = strtok(msg," ");
p = strtok(NULL," ");
return p;
}
int cmdhander(char msg[128],int c_fd)
{
int nwrite;
int nread;
int size;
//char buf[1024] = {0};
char *dir = NULL;
int fdfile;
int ret = change(msg);
// printf("2.%d\n",ret);
// printf("3.%s\n",msg);
switch(ret){
case LS:
case PWD:
write(c_fd,msg,sizeof(msg));
// printf("mag = %s\n",msg);
break;
case CD:
write(c_fd,msg,sizeof(msg));
// read(c_fd,secondbuf,sizeof(secondbuf));
// printf("%s\n",secondbuf);
break;
case QUIT:
strcpy(msg,"quit");
write(c_fd,msg,sizeof(msg));
close(c_fd);
exit(-1);
case LLS:
system("ls");
break;
case LPWD:
system("pwd");
break;
case GET:
nwrite = write(c_fd,msg,strlen(msg));
// printf("5.%s\n",msg);
// printf("6.%d\n",nwrite);
// printf("7.%ld\n",strlen(msg));
break;
case PUT:
write(c_fd,msg,strlen(msg));
break;
case LCD:
dir = getdesdir(msg);
// printf("%s\n",dir);
chdir(dir);
break;
}
return ret;
}
void putmsg(char *msg,int c_fd,int ret) ///发文件
{
char *secondbuf = NULL;
int fdfile = open(getdesdir(msg),O_RDWR);
if(fdfile == -1){
printf("No This File\n");
}else{
int size = lseek(fdfile,0,SEEK_END);
// printf("4.%d\n",size);
lseek(fdfile,0,SEEK_SET);
secondbuf = malloc(sizeof(char)*size+1);
int nread = read(fdfile,secondbuf,size);
// printf("5.%d\n",nread);
int nwrite = write(c_fd,secondbuf,size);
// printf("6.%d\n",nwrite);
close(fdfile);
}
}
int getmsg(char *msg,int c_fd,int ret) //从服务器获得信息
{
char getmsg[10240] = {0};
int nwrite;
char *dir = NULL;
// int ret = cmdhander(msg,c_fd);
if(ret == PUT){
return PUT;
}
int nread = read(c_fd,getmsg,sizeof(getmsg));
//: printf("8.raed = %d\n",nread);
if(nread == 0){
printf("error");
exit(-1);
}else if(ret == GET){ //获取文件
dir = getdesdir(msg);
// printf("4.%s\n",dir);
int fdfile = open(dir,O_RDWR|O_CREAT,0600);
//printf("fdfile%d\n",fdfile);
//read(c_fd,getmsg,sizeof(getmsg));
//printf("8.read = %d\n",nread);
nwrite = write(fdfile,getmsg,nread);
// printf("9.write = %d\n",nwrite);
//memset(getmsg,0,sizeof(getmsg));
close(fdfile);
}
else printf("%s",getmsg);
return ret;
}
int main(int argc , char **argv)
{
//1 socket
int c_fd;
int nwrite;
char msg[128] = {0};
struct sockaddr_in c_addr;
char readbuf[128];
if(argc != 3){
perror("error");
exit(-1);
}
memset(&c_addr,0,sizeof(struct sockaddr_in));
//1.socket
c_fd = socket(AF_INET,SOCK_STREAM,0);
if(c_fd == -1){
perror("socket error:");
exit(-1);
}
//2.connect
c_addr.sin_family = AF_INET;
c_addr.sin_port = htons(atoi(argv[2]));
inet_aton(argv[1],&c_addr.sin_addr);
if(connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr)) == -1){
perror("error");
exit(-1);
}else
printf("connect...\n");
while(1){
memset(&msg,0,sizeof(msg));
printf("input cmd: ");
gets(msg);
// msghander(msg,c_fd);
// printf("%s\n",msg);
int ret = cmdhander(msg,c_fd);
if(ret == -1){
printf("conmand not\n");
continue;
}
if(ret <= 4){
// printf(">");
continue;
}
if(ret == PUT){
putmsg(msg,c_fd,ret);
}else
getmsg(msg,c_fd,ret);
}
close(c_fd);
return 0;
}