做这个项目是首先用到了socket网路编程,然后在这个网络编程框架的基础上添加一些内容。
内容:
0.登录用户,客户端才可访问服务器
1.客户端展示服务器有那些文件
2.客户端展示服务器当前路径
3.客户端进入服务器的某个文件
4.客户端获取服务器的文件
5.客户端上传文件到服务器
其中用到了这些函数:
strstr() 查字串
strcmp() 比较
strcpy() 拷贝
strtok() 分割
popen() 启动另外一个进程去执行一个shell命令行
fread() 读取popen的结果
chdir() 改变当前工作目录
access() 判断指定的文件或目录是否存在
open() 打开或创建文件
read() 读取数据
write() 写数据
close() 关闭文件
例子:
服务端:
#include<stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include"config.h"
#include <stdlib.h>
#include<string.h>
#include <sys/stat.h>
#include <fcntl.h>
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:%s\n",msg.date);
printf("put:%s\n",msg.readbuf);
printf("type:%s\n",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("%s\n",msg.date);
break;
case CD:
p=strtok_cmd(msg.date);
printf("dir:%s\n",msg.date);
chdir(p);
break;
case GET:
file=strtok_cmd(msg.date);
if(access(file,F_OK)==-1){
strcmp(msg.date,"no file\n");
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 out\n");
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 3\n");
}
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:%s\n",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<stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include"config1.h"
#include <fcntl.h>
#include <stdlib.h>
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 error\n");
}
}
}
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 out\n");
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 out\n");
exit(-1);
}
else{
printf("-----------------------\n");
printf("\n%s\n",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: %s\n",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 file\n");
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 3\n");
}
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 not\n");
fflush(stdout);
continue;
}
read_handler(msg,c_fd);
}
return 0;
}