做这个项目是首先用到了socket网路编程,然后在这个网络编程框架的基础上添加一些内容。
内容:
0.登录用户,客户端才可访问服务器
1.客户端展示服务器有那些文件
2.客户端展示服务器当前路径
3.客户端进入服务器的某个文件
4.客户端获取服务器的文件
5.客户端上传文件到服务器
其中用到了这些函数:
strstr() 查字串
strcmp() 比较
strcpy() 拷贝
strtok() 分割
popen() 启动另外一个进程去执行一个shell命令行
fread() 读取popen的结果
chdir() 改变当前工作目录
access() 判断指定的文件或目录是否存在
open() 打开或创建文件
read() 读取数据
write() 写数据
close() 关闭文件
例子:
服务端:
#include#include #include #include #include #include"config.h" #include #include #include #include char* strtok_cmd(char* cmd) { char* p; p=strtok(cmd," "); p=strtok(NULL," "); return p; } void get_read(struct Msg msg,int c_fd) { int fp; char* file; file=strtok_cmd(msg.date); fp=open(file,O_RDWR|O_CREAT,0600); write(fp,msg.readbuf,strlen(msg.readbuf)); close(fp); } int server_msg(char* cmd) { if(!strcmp("ls",cmd)) return LS; if(!strcmp("pwd",cmd)) return PWD; if(!strcmp("quit",cmd)) return QUIT; if(strstr(cmd,"cd")!=NULL) return CD; if(strstr(cmd,"get")!=NULL) return GET; if(strstr(cmd,"put")!=NULL) return PUT; } void write_handler(struct Msg msg,int c_fd) { FILE *fp; char* p; char* file; int filefp; char readbuf[1024]; printf("cmd:%sn",msg.date); printf("put:%sn",msg.readbuf); printf("type:%sn",msg.type); int ret=server_msg(msg.date); switch(ret){ case LS: case PWD: fp=popen(msg.date,"r"); memset(msg.date,0,sizeof(msg.date)); fread(msg.date,sizeof(msg.date),1,fp); write(c_fd,&msg,sizeof(msg)); printf("%sn",msg.date); break; case CD: p=strtok_cmd(msg.date); printf("dir:%sn",msg.date); chdir(p); break; case GET: file=strtok_cmd(msg.date); if(access(file,F_OK)==-1){ strcmp(msg.date,"no filen"); write(c_fd,&msg,sizeof(msg)); } else{ filefp=open(file,O_RDWR); read(filefp,readbuf,sizeof(readbuf)); close(filefp); write(c_fd,readbuf,strlen(readbuf)); } break; case PUT: get_read(msg,c_fd); break; case QUIT: printf("quit outn"); exit(-1); } } int main(int argc,char** argv) { int s_fd; int c_fd; struct sockaddr_in s_addr; struct sockaddr_in c_addr; struct Msg msg; if(argc!=3){ printf("argc no 3n"); } s_fd=socket(AF_INET,SOCK_STREAM ,0); 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)); listen(s_fd,10); int len=sizeof(struct sockaddr_in); while(1){ c_fd=accept(s_fd,(struct sockaddr *)&c_addr,&len); if(c_fd==-1){ perror("accept"); exit(-1); } printf("connect:%sn",inet_ntoa(s_addr.sin_addr)); if(fork()==0){ while(1){ memset(msg.date,0,sizeof(msg.date)); int n_read=read(c_fd,&msg,sizeof(msg)); if(n_read==-1){ perror("read"); exit(-1); } else{ write_handler(msg,c_fd); } } } } close(c_fd); close(s_fd); return 0; }
客户端:
#include#include #include #include #include #include #include #include"config1.h" #include #include int get_lock() { char name[128]; char lock[128]; while(1){ printf("Username:n"); scanf("%s",name); printf("Password:n"); scanf("%s",lock); if(!strcmp("CLC",name) && !strcmp("1",lock)){ return 1; }else{ printf("Username or Password errorn"); } } } char* strtok_cmd(char* cmd) { char* p; p=strtok(cmd," "); p=strtok(NULL," "); return p; } void get_read(struct Msg msg,int c_fd) { int fp; int n_read; char* file; char msgget[1024]={0}; n_read=read(c_fd,msgget,sizeof(msgget)); if(n_read==0){ printf("server in outn"); exit(-1); } else{ file=strtok_cmd(msg.date); fp=open(file,O_RDWR|O_CREAT,0600); write(fp,msgget,strlen(msgget)); close(fp); } } void read_handler(struct Msg msg,int c_fd) { int n_read; struct Msg msgget; n_read=read(c_fd,&msgget,sizeof(msgget)); if(n_read==0){ printf("server in outn"); exit(-1); } else{ printf("-----------------------n"); printf("n%sn",msgget.date); printf("-----------------------n"); } } int get_cmd_type(char *cmd) { if(strstr(cmd,"lcd")!=NULL) return LCD; if(!strcmp("ls",cmd)) return LS; if(!strcmp("quit",cmd)) return QUIT; if(!strcmp("pwd",cmd)) return PWD; if(strstr(cmd,"cd")!=NULL) return CD; if(strstr(cmd,"get")!=NULL) return GET; if(strstr(cmd,"lls")!=NULL) return LLS; if(strstr(cmd,"put")!=NULL) return PUT; return -1; } int write_handler(struct Msg msg,int c_fd) { int fp; char* file; char* dir; printf("cmd: %sn",msg.date); int ret=get_cmd_type(msg.date); switch(ret){ case LS: case CD: case PWD: write(c_fd,&msg,sizeof(msg)); break; case LLS: system("ls"); break; case LCD: dir=strtok_cmd(msg.date); chdir(dir); break; case GET: write(c_fd,&msg,sizeof(msg)); get_read(msg,c_fd); break; case PUT: strcpy(msg.type,msg.date); file=strtok_cmd(msg.type); if(access(file,F_OK)==-1){ strcpy(msg.date,"no filen"); write(c_fd,&msg,sizeof(msg)); } else{ memset(msg.readbuf,0,sizeof(msg.readbuf)); fp=open(file,O_RDWR); read(fp,msg.readbuf,sizeof(msg.readbuf)); close(fp); write(c_fd,&msg,sizeof(msg)); } break; case QUIT: strcpy(msg.date,"quit"); write(c_fd,&msg,sizeof(msg)); close(c_fd); exit(-1); } return ret; } int main(int argc,char** argv) { int c_fd; int n_read; int n=0; struct sockaddr_in c_addr; struct Msg msg; if(argc!=3){ printf("argv no 3n"); } c_fd=socket(AF_INET,SOCK_STREAM,0); if(c_fd==-1){ perror("socket"); } 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_in))==-1){ perror("connecut"); exit(-1); } printf("connect ..n"); n=get_lock(); getchar(); while(n){ gets(msg.date); int ret=write_handler(msg,c_fd); if(ret>IFGO){ continue; } if(ret==-1){ printf("conmand notn"); fflush(stdout); continue; } read_handler(msg,c_fd); } return 0; }



