service
#include<stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#define FIF 5
#define READSIZE 1024
#define WRITESIZE 128
#define SERVICERETURN "service return:"
char *getbehind(char cmd[128])
{
char *p;
p = (char *)malloc(128);
p = strtok(cmd," ");
p = strtok(NULL," ");
return p;
}
void receivefile(char cmd[128],int c_fd)
{
char *p = getbehind(cmd);
char *readBuf = (char *)malloc(8000);
int fd = open(p,O_RDWR | O_CREAT,0666);
read(c_fd,readBuf,8000);
write(fd,readBuf,8000);
printf("service recive file success!\n");
close(fd);
memset(p,0,8000);
memset(readBuf,0,8000);
}
int change(char cmd[128])
{
if(!strcmp("ls",cmd))
{
return 1;
}
else if(!strcmp("ps",cmd))
{
return 2 ;
}
else if(!strcmp("g",cmd))
{
return 3;
}
else if(strstr(cmd,"lcd") != NULL)
{
return 4;
}
else if(strstr(cmd,"get") !=NULL)
{
return 5;
}
else if(strstr(cmd,"put"))
{
return 6;
}
else if(strstr(cmd,"cd") != NULL)
return 7;
}
void chooescmd(char cmd[128],int c_fd)
{
int ret = change(cmd);
FILE *fdb;
char *Freadbuf = (char *)malloc(128);
char *p = (char *)malloc(8000);
char readbuf[8000] = {};
//char *readBuf_1 = (char *)malloc(128);
int sfd = -1;
printf("ret = %d\n",ret);
switch(ret)
{
case 1:
fdb = popen("ls","r");
fread(readbuf,sizeof(readbuf),1,fdb);
write(c_fd,readbuf,sizeof(readbuf));
memset(readbuf,0,sizeof(readbuf));
printf("The message was sent to the client successfully.\n");
break;
case 2:
system("ps");
break;
case 3:
read(c_fd,Freadbuf,128);
printf("%s\n",Freadbuf);
exit(0);
break;
case 4:
printf("client into path success!\n");
break;
case 5:
memset(readbuf,0,8000);
p = getbehind(cmd);
if(access(p,F_OK) == -1)
{
write(c_fd,"not file!",strlen("not file!"));
}
else
{
sfd = open(p,O_RDWR,0666);
read(sfd,readbuf,8000);
write(c_fd,readbuf,sizeof(readbuf));
close(sfd);
memset(p,0,8000);
}
break;
case 6:
receivefile(cmd,c_fd);
break;
case 7:
p = getbehind(cmd);
if(chdir(p) == -1)
{
printf("service shift error\n");
}
else
{
printf("service shift success\n");
}
break;
}
}
int main(int argc,char *argv[])
{
if(argc != 3)
{
perror("argc");
exit(0);
}
int s_fd = -1;
int c_fd = -1;
pid_t pid;
int nread = -1;
char Readbuf[READSIZE] = {};
char Writebuf[WRITESIZE] = {};
s_fd = socket(AF_INET,SOCK_STREAM,0);
if(s_fd == -1)
{
perror("socket:");
exit(0);
}
struct sockaddr_in s_addr;
struct sockaddr_in c_addr;
//init
bzero(&s_addr,sizeof(s_addr));
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(atoi(argv[2]));
inet_pton(AF_INET,argv[1],&s_addr.sin_addr.s_addr);
//bind
int bind_ret = bind(s_fd,(struct sockaddr *)&s_addr,sizeof(s_addr));
if(bind_ret == -1)
{
perror("bind:");
exit(0);
}
//listen
int listen_ret = -1;
listen_ret = listen(s_fd,FIF);
if(listen_ret == -1)
{
perror("listen");
exit(0);
}
printf("wait connecting!\n");
socklen_t addrlen = sizeof(struct sockaddr_in);
memset(&c_addr,0,addrlen);
while(1)
{
//accept
c_fd = accept(s_fd,(struct sockaddr *)&c_addr,&addrlen);
if(c_fd == -1)
{
perror("accept:");
continue;
}
printf("connect success! %s\n",inet_ntoa(c_addr.sin_addr));
pid = fork();
if(pid == 0)
{
while(1)
{
nread = read(c_fd,Readbuf,128);
chooescmd(Readbuf,c_fd);
bzero(Readbuf,sizeof(Readbuf));
}
}
}
return 0;
}
client
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#define READSIZE 1024
#define WRITESIZE 128
char *getbind(char cmd[128])
{
char *p = (char *)malloc(128);
p = strtok(cmd," ");
p = strtok(NULL," ");
return p;
}
void getmessage(char cmd[128],int c_fd)
{
char *p = getbind(cmd);
int fd = open(p,O_RDWR|O_CREAT,0666);
char readBuf[8000] = {};
read(c_fd,readBuf,8000);
write(fd,readBuf,strlen(readBuf));
printf("updown success!\n");
close(fd);
memset(p,0,sizeof(p));
}
void putmessage(char cmd[128],int c_fd)
{
char *p = getbind(cmd);
if(access(p,F_OK) == -1)
{
printf("the client not file!\n");
write(c_fd,"the client not file!",strlen("the client not file!"));
}
else
{
int fd = open(p,O_RDWR,0666);
char *readBuf = (char *)malloc(8000);
read(fd,readBuf,8000);
write(c_fd,readBuf,strlen(readBuf));
printf("the file put success!\n");
close(fd);
memset(p,0,8000);
memset(readBuf,0,8000);
}
}
int change(char cmd[128])
{
if(!strcmp(cmd,"lls"))
return 1;
else if(!strcmp(cmd,"ls"))
return 2;
else if(!strcmp(cmd,"g"))
return 3;
else if(strstr(cmd,"lcd") != NULL)
{
return 4;
}
else if(strstr(cmd,"cd") != NULL)
{
return 5;
}
else if(strstr(cmd,"get") != NULL)
return 6;
else if(strstr(cmd,"put") != NULL)
return 7;
}
void chooescmd(char cmd[128],int c_fd)
{
int ret = change(cmd);
printf("cmd:%s ret:%d\n",cmd,ret);
char *p = (char *)malloc(8000);
switch(ret)
{
case 1:
system("ls");
break;
case 2:
read(c_fd,p,8000);
printf("%s\n",p);
bzero(p,8000);
break;
case 3:
printf("unconnecting!\n");
write(c_fd,"away host",128);
close(c_fd);
exit(0);
break;
// case 4:
// printf("service into %s",cmd);
// break;
case 4:
p = getbind(cmd);
chdir(p);
printf("client into %s\n",cmd);
//memset(p,0,8000);
bzero(p,sizeof(p));
break;
case 5:
/* p = getbind(cmd);
chdir(p);
printf("client into %s\n",cmd);
//memset(p,0,8000);
bzero(p,sizeof(p));
*/
printf("into service path ok!\n");
break;
case 6:
getmessage(cmd,c_fd);
break;
case 7:
putmessage(cmd,c_fd);
break;
}
}
int main(int argc,char *argv[])
{
char readBuf[READSIZE];
char writeBuf[WRITESIZE];
//create struct sockaddr_in;
struct sockaddr_in sin;
if(argc != 3)
{
perror("argc");
exit(0);
}
//create socket
int c_fd = -1;
c_fd = socket(AF_INET,SOCK_STREAM,0);
if(c_fd == -1)
{
perror("socket");
exit(0);
}
//init struct sin
bzero(&sin,sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_port = htons(atoi(argv[2]));
inet_pton(AF_INET,argv[1],&sin.sin_addr.s_addr);
//connect
int cn_ret = -1;
cn_ret = connect(c_fd,(struct sockaddr *)&sin,sizeof(sin));
if(cn_ret == -1)
{
perror("connect");
exit(0);
}
printf("connect success!.................\n");
//wait send(write)
while(1)
{
bzero(writeBuf,WRITESIZE);
printf("..>");
gets(writeBuf);
printf("cmd:....%s\n",writeBuf);
write(c_fd,writeBuf,strlen(writeBuf));
chooescmd(writeBuf,c_fd);
printf("---------cmd---------\n");
//bzero(writeBuf,strlen(writeBuf));
memset(writeBuf,0,strlen(writeBuf));
}
return 0;
}