题目ftp云盘,代码编写分为客户端,服务端,配置文件
通过TCP协议,利用套接字socket具体实现。
实现功能分为客户端(lls,lpwd,lcd),服务端(ls,cd,pwd,)以及双方文件交互功能(get,put)
此为ftp云盘客户端
//包含头文件
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include "msg.h"
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
//处理接收到的命令,通过配置文件中的宏定义返回相应int值
int handler_cmd(char *cmd)
{
if(strstr(cmd,"lcd")) return LCD;
if(!strcmp("lls",cmd)) return LLS;
if(!strcmp("lpwd",cmd)) return LPWD;
if(!strcmp("ls",cmd)) return LS;
if(!strcmp("pwd",cmd)) return PWD;
if(strstr(cmd,"cd")) return CD;
if(strstr(cmd,"put")) return PUT;
if(strstr(cmd,"get")) return GET;
if(!strcmp("quit",cmd)) return QUIT;
return -1;
}
void interface()
{
printf("==========================\n");
}
//cd put get命令需要分割字符串,获取第二个字符即相应文件
char *hand_message(char *cmd)
{
char *p;
p = strtok(cmd," ");
p = strtok(NULL," ");
return p;
}
//处理完数据后,通过此函数来响应即打印结果或者其他
void cmd_server_msg(struct Msg msg,int fd,int ret)
{
int n_read;
struct Msg msgget;
n_read = read(fd,&msgget,sizeof(msgget));
if(n_read == 0){
printf("client quit\n");
exit(0);
}else if(ret == 8){
char *p = hand_message(msg.data);
int f_fd = open(p,O_RDWR|O_CREAT,0600);
if(f_fd == -1){
perror("open");
}
write(f_fd,msgget.data,strlen(msgget.data));
}else{
printf("==========================\n");
printf("%s\n",msgget.data);
printf("==========================\n");
}
}
//处理命令,根据返回值处理实际命令
int cmd_server(struct Msg msg,int fd)
{
char *dir;
char *file = NULL;
int ret;
int p_fd;
char data[128];
ret = handler_cmd(msg.data);
switch(ret){
case LS:
case PWD:
write(fd,msg.data,sizeof(msg.data));
break;
case CD:
write(fd,msg.data,sizeof(msg.data));
read(fd,&msg,sizeof(msg));
printf("%s\n",msg.data);
break;
case LLS:
system("ls");
interface();
break;
case LPWD:
system("pwd");
interface();
break;
case LCD:
dir = hand_message(msg.data);
if(access(dir,F_OK)){
printf("no this file!\n");
}
else{
chdir(dir);
}
break;
case PUT:
strcpy(data,msg.data);
file = hand_message(data);
if(access(file,F_OK) == -1){
printf("%s,the file not exit\n",file);
}else{
p_fd = open(file,O_RDWR);
read(p_fd,msg.dataBuf,sizeof(msg.dataBuf));
close(p_fd);
write(fd,&msg,sizeof(msg));
}
break;
case GET:
write(fd,&msg,sizeof(msg));
interface();
break;
case QUIT:
strcpy(msg.data,"quit");
write(fd,msg.data,sizeof(msg.data));
close(fd);
exit(0);
}
return ret;
}
void display()
{
printf("==========================\n");
printf("==========================\n");
printf("==========================\n");
printf("welcom to Aaron ftp Cloud disk\n");
printf("==========================\n");
printf("==========================\n");
printf("==========================\n");
}
int main(int argc,char **argv)
{
int c_fd;
struct sockaddr_in c_addr;
char readBuf[128];
int n_read;
struct Msg msg;
if(argc != 3){
printf("param error\n");
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);
int clen = sizeof(struct sockaddr);
if(connect(c_fd,(struct sockaddr *)&c_addr,clen) == -1){
perror("connect");
}
printf("accepted...\n");
display();
while(1){
memset(&msg,0,sizeof(msg));
printf(">");
gets(msg.data);
int ret = cmd_server(msg,c_fd);
//找不到则返回-1,表示命令不支持
if(ret == -1){
printf("conmand not\n");
continue;
}
//返回值小于直接在客户端执行,不往服务端走
if(ret < 6){
interface();
if(ret < 4){
printf(">");
}
continue;
}
cmd_server_msg(msg,c_fd,ret);
}
close(c_fd);
return 0;
}
上接配置文件
配置文件
下接服务端
服务端
学识浅薄,希望能帮到您