//structure_Function.h
#include <stdio.h>
struct data_Interaction
{
int count;
char data_One[128];
char data_Two[1024];
char data_Three[1024];
};
//服务端
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "structure_Function.h"
#define LS 1
#define PWD 2
#define GET 3
#define CD 4
int Strcmp(char *s)
{
if(strcmp(s,"ls")==0){
return LS;
}
if(strcmp(s,"pwd")==0){
return PWD;
}
if(strstr(s,"get")!=NULL){
return GET;
}
if(strstr(s,"cd")!=NULL){
return CD;
}
}
char *get_chdir(char *q)
{
char *t=NULL;
t=strtok(q," ");
t=strtok(NULL," ");
return t;
}
void get_Des(struct data_Interaction msg,int c_fd)
{
int fd;
int size;
int count=0;
int remainder=0;
int w_write;
int n_read;
int ret;
char buf[1024]={0};
char *from_GetChdir=NULL;
FILE *r=NULL;
ret = Strcmp(msg.data_One);
printf("msg.data_One:%s\n",msg.data_One);
memset(msg.data_Two,0,sizeof(msg.data_Two));
switch(ret){
case CD :
from_GetChdir=get_chdir(msg.data_One);
chdir(from_GetChdir);
break;
case LS :
case PWD :
r=popen(msg.data_One,"r");
fread(msg.data_Two,sizeof(msg.data_Two),1,r);
write(c_fd,&msg,sizeof(msg));
break;
case GET :
from_GetChdir=get_chdir(msg.data_One);
fd = open(from_GetChdir,O_RDWR,0600);
size = lseek(fd,0,SEEK_END);
lseek(fd,0,SEEK_SET);
memset(msg.data_Three,0,sizeof(msg.data_Three));
memset(buf,0,sizeof(buf));
count=size/1024;
remainder=size%1024;
if (remainder>0)
{
count=count+1;
}
for (int i = 0; i < count; i++)
{
msg.count=size;
printf("msg.count:%d\n",msg.count );
n_read = read(fd,buf,sizeof(buf)-1);
memset(msg.data_Three,0,sizeof(msg.data_Three));
strcpy(msg.data_Three,buf);
memset(buf,0,sizeof(buf));
w_write = write(c_fd,&msg,sizeof(msg));
}
close(fd);
break;
default :
write(c_fd,&msg.data_Two,sizeof(msg.data_Two));
break;
}
}
int main(int argc,const char **argv)
{
struct data_Interaction s_Data;
int c_Fd;
int s_Fd;
int s_Bind;
int s_Listen;
struct sockaddr_in s_addr;
struct sockaddr_in c_addr;
memset(&s_addr,0,sizeof(s_addr));
memset(&c_addr,0,sizeof(c_addr));
int len=sizeof(c_addr);
if(argc !=3)
{
perror("why");
exit(1);
}
s_Fd = socket(AF_INET,SOCK_STREAM,0);
if(s_Fd ==-1 )
{
perror("socket");
exit(1);
}
s_addr.sin_family= AF_INET;
s_addr.sin_port = htons(atoi(argv[2]));
inet_aton(argv[1],&s_addr.sin_addr);
s_Bind = bind(s_Fd,(struct sockaddr *)&s_addr,sizeof(s_addr));
s_Listen = listen(s_Fd,10);
while(1){
c_Fd = accept(s_Fd,(struct sockaddr *)&c_addr,&len);
if(c_Fd ==-1)
{
perror("accept");
exit(1);
}
else{
if(fork()==0){
while(1){
memset(s_Data.data_One,0,sizeof(s_Data.data_One));
read(c_Fd,&s_Data,sizeof(s_Data));
printf("--->:");
printf("%s\n",s_Data.data_One);
printf("--->:");
get_Des(s_Data,c_Fd);
}
}
}
}
close(s_Fd);
close(c_Fd);
return 0;
}
//客户端
#include<stdio.h>
#include <unistd.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "structure_Function.h"
#define LLS 1
#define LS 2
#define PPWD 3
#define PWD 4
#define CD 5
#define LCD 6
#define GET 7
int Strcmp(char *s)
{
if(strcmp(s,"lls")==0){
return LLS;
}
if(strcmp(s,"ls")==0){
return LS;
}
if(strcmp(s,"pwd")==0){
return PWD;
}
if(strcmp(s,"ppwd")==0){
return PPWD;
}
if(strstr(s,"get") !=NULL){
return GET;
}
if(strstr(s,"lcd") !=NULL){
return LCD;
}
if(strstr(s,"cd") !=NULL){
return CD;
}
}
char *get_chdir(char *cmd)
{
char *t;
t=strtok(cmd," ");
t=strtok(NULL," ");
return t;
}
void get_Des(struct data_Interaction msg,int c_fd)
{
int w_write;
int fd;
int ret;
int n_read;
char buf[1024]={0};
char *from_GetChdir;
ret = Strcmp(msg.data_One);
memset(msg.data_Two,0,sizeof(msg.data_Two));
switch(ret){
case LLS :
system("ls");
break;
case PPWD :
system("pwd");
break;
case LS :
case PWD :
write(c_fd,&msg,sizeof(msg));
recv(c_fd,&msg,sizeof(msg),0);
printf("from s_read:%s",msg.data_Two);
break;
case LCD :
from_GetChdir=get_chdir(msg.data_One);
chdir(from_GetChdir);
break;
case CD :
write(c_fd,&msg,sizeof(msg));
break;
case GET:
memset(msg.data_Three,0,sizeof(msg.data_Three));
write(c_fd,&msg,sizeof(msg));
from_GetChdir=get_chdir(msg.data_One);
fd = open(from_GetChdir,O_RDWR|O_CREAT,0600);
while((n_read = read(c_fd,&msg,sizeof(msg)))>0)
{
printf("msg.count:%d\n",msg.count );
memset(buf,0,sizeof(buf));
strcpy(buf,msg.data_Three);
w_write = write(fd,buf,strlen(buf));
memset(buf,0,sizeof(buf));
if(w_write<1023)
{
close(fd);
break;
}
}
break;
default :
printf("input error:%s\n",msg.data_One);
break;
}
}
int main(int argc ,char **argv)
{
int c_Fd;
struct data_Interaction c_Data;
struct sockaddr_in c_addr;
int len=sizeof(c_addr);
memset(&c_addr,0,sizeof(c_addr));
if(argc !=3)
{
perror("why");
printf("1");
exit(1);
}
c_Fd = socket(AF_INET,SOCK_STREAM,0);
if(c_Fd ==-1 )
{
perror("socket");
exit(1);
}
c_addr.sin_family= AF_INET;
c_addr.sin_port = htons(atoi(argv[2]));
inet_aton(argv[1],&c_addr.sin_addr);
connect(c_Fd,(struct sockaddr *)&c_addr,sizeof(c_addr));
while(1){
memset(c_Data.data_One,0,sizeof(c_Data.data_One));
printf("--->:");
gets(c_Data.data_One);
printf("--->:");
get_Des(c_Data,c_Fd);
}
close(c_Fd);
return 0;
}
如有更好的方法,欢迎交流学习。