- 一 FTP 云盘
- 二 服务器和客户端基本框架
- 三 服务器 代码
- 四 客户端代码
- 五 指令实现思路
- 六 ls ifconfig get out效果
总得来说
1 服务器作为中转站 返回客户端写的数据 (过滤的情况) 2 客户端在读的时候 服务器必定是在写数据 (不过滤的情况) 3 但是都是在客户端完成 效果是在各自中呈现。二 服务器和客户端基本框架
补充函数
strcmp :字符串对比函数
strcmp函数用法
三 服务器 代码#include四 客户端代码#include #include #include #include #include #include #include int chance(char cmd[128]) { if(strcmp("ls",cmd)==0) { return 1; } else if(strcmp("ifconfig",cmd)==0) { return 2; } else if(strcmp("get out",cmd)==0) { return 3; } else { return 0 ; } } void choosecmd(char cmd[128],int c_fd) { int ret=chance(cmd); FILE *c_ls; char *r_p=(char *)malloc(5000); char *g_p=(char *)malloc(5000); switch(ret) { case 1:c_ls=popen("ls","r");;//服务器作为过滤的情况 read(c_fd,r_p,sizeof(r_p)); write(c_fd,r_p,sizeof(r_p)); memset(&r_p,0,sizeof(r_p)); printf("OKn"); break; case 3 : printf("socket is stop work......");;//服务器作为过滤的情况 read(c_fd,g_p,sizeof(g_p)); write(c_fd,g_p,sizeof(g_p)); memset(&g_p,0,sizeof(g_p)); case 2:system("ifconfig") break;//服务器作为不过滤的情况 } } int main(int argc,char **argv) { if(argc!=3) { perror("argc"); exit(1); } int s_fd =-1; int c_fd =-1; struct sockaddr_in sin; struct sockaddr_in cin; s_fd=socket(AF_INET,SOCK_STREAM,0); if(fd==-1) { perror("socket"); exit(1); } memset(&sin,0,sizeof(sin)); sin.sin_family=AF_INET; sin.sin_port=htons(atoi(argv[1])); sin.sin_addr.s_addr=inet_addr(argv[2]); if(bind(s_fd,(struct sockaddr *)&sin,sizeof(sin))<0) { perror("bind"); exit(1); } listen(s_fd,5) char readbuf[1024]; socklen len=sizeof(cin); pid_t pid; while(1) { c_fd=accept(fd,(struct sockaddr* )&cin,&len);//&ci哪里都存有端口号和 i 地址了但是现在为网络字节 序 需要转为主机字节序 if(c_fd==-1) { perror("accept"); exit(1); } printf("IPV4=====%sn,ntohs(cin.sin_port)); //ntohs函数网络字节序转为主机字节序 pid=fork(); if(pid==0) { while(1) { read(c_fd,readbuff,1024); choosecmd(readbuff,c_fd); memset(&readbuff,0,strlen(readbuff)); } } } return 0; }
#include五 指令实现思路#include #include #include #include #include #include int chance(char cmd[128]) { if(strcmp("ls",cmd)==0) { return 1; } else if(strcmp("ifconfig",cmd)==0) { return 2; } else if(strcmp("get out",cmd)==0) { return 3; } else { return 0 ; } } void choosecmd(char cmd[128],int c_fd) { int ret=chance(cmd); char *r_p=(char *)malloc(5000); switch(ret) { case 1::system("ls") ; break; case 2: read(c_fd,r_p,sizeof(r_p)); printf("%sn",r_p); memset(r_p,0,sizeof(r_p)); break; case 3 :system("get out") ; break; } } int main(int argc,char **argv) { if(argc!=3) { perror("argc"); exit(1); } int c_fd=-1; struct sockaddr_in sin; fd=socket(AF_INET,SOCK_STREAM,0); if(fd<0) { perror("socket"); exit(1); } memset(&sin,0,sizeof(sin)); sin.sin_family=AF_INET; sin.sin_port=htons(atoi(argv[2])); sin.sin_addr.s_addr=inet_addr(argv[1]); if(connect(c_fd,(struct sockaddr*)&sin,sizeof(sin))<0) { perror("connect"); exit(1); } char buf[1024]; while(1) { gets(buf); write(c_fd,buf,sizeof(buf)); printf("cmd :%sn",buf); choosecmd(buf,c_fd); printf("***********cmd************n"); memset(buf,0,strlen(buf)); } return 0; }
没啥花里胡哨的思路 就是这么简单。
ifconfig 因为服务器只能过滤 不可写 只能重定向 为客户端 才行六 ls ifconfig get out效果



