FTP文件管理项目(本地云)项目日报(九)
发布日期:2021-06-30 19:45:33 浏览次数:3 分类:技术文章

本文共 27474 字,大约阅读时间需要 91 分钟。

文章目录

写了这第九篇日报,就意味着这个为期12个“工作日”的项目到了大后期啦。
这两天我去找我哥聊了聊这个项目的架构,他是做Java的,不过对我用C++讲的这个项目还是很有兴趣哈哈哈。

一路下来,只剩四个人啦,从刚开始的十个人。

剩下的四个人

1号(服务器)
5号(测试端)
8号(客户端)
9号(客户端)

其中5号已经交上代码功成身退了。

其实我的初衷也是如此,除去我还剩九个人,最后能留下三个足矣。

且不说我们做的咋样,只要坚持下来,就是好样的!!!


本日任务

重构

完成情况

高估了自己,任务太重,FTP服务器模块还没重构,DB服务器重构之后还没对各模块再次测试,估计还要一天。

这两天做了些动态库,把进程间通信由静态变为动态(之前代码里的备注说回头改的地方),现在可以自由拓展了。

数据库功能完善与上锁,协议包再修订(今晚还要微调)。

代码

Linux系统关了,不想再开,关之前忘了把代码拿出来,所以下面这个代码是改bug之前的。

//DB_command.h#include"DB_base.h"#include"Mutex.h"class DB_command{
private: DB_base* My_DB; Mutex* DB_Mutex;public: DB_command(); //增 bool add_user(int id,int pwd,char* tel,char* err); bool add_file(char* file_name,int owner_id, int pwd, int mode,int dir_id,int force,char* err);//force,是否替换原文件 bool add_list(int id,int pwd,int father_dir,char* dir_name,char* err); //删 bool del_user(int user_id,int pwd); bool del_file(int user_id,int pwd,char* file_name,int dir_id,char* err); bool del_list(int user_id,int pwd,int dir_id,char* err); //查 bool login_check(int user_id,int pwd); //登录验证,不带目录id int login(int user_id, int pwd,char* err); //带上id的登录验证 int pwd(int user_id,char* tel); void file_list(int user_id,int pwd,int dir_id, char* ret,char* err); bool download(int user_id,int pwd,char* file_name, int dir_id,int shared,char* err); //改 bool cpwd(int user_id, int old_pwd, int new_id,char* err); bool cfile_addr(int user_id,int pwd,char* file_name, int old_dir, int new_dir,char* err); bool cdir_addr(int user_id,int pwd,char* dir_name, int new_dir,char* err); bool share_file(int user_id, int pwd, int shared, char* file_name, int dir_id,char* err); bool cfile_name(int user_id, int pwd, char* file_name, int file_id, int dir_id,char* err); bool cdir_name(int user_id, int pwd, char* dir_name, int dir_id,char* err); //适配器函数 char* dir(int dir_id); //将dir_id转换为dir_name char* file(int file_id);//将file_id转换为file_name};
//DB_command.cpp#include "DB_command.h"DB_command::DB_command() {
/* DB_init* init = new DB_init(); init->commmand(); delete init;*/ char* name = new char[10]; sprintf(name, "FTP.db"); My_DB = DB_base::instence(name); delete name; DB_Mutex = new Mutex();}//增bool DB_command::add_user(int id, int pwd, char* tel,char* err) {
//先查一下该用户是否已存在 char* sql = new char[120]; int ret = 0; DB_Mutex->lock(); sprintf(sql, "select pwd from UserMsg where id = %d", id); if (int a = My_DB->return_serch_num(sql) == 1) {
strcpy(err, "User already in!"); DB_Mutex->unlock(); delete sql; return false; } else {
//查询目录id使用情况 sprintf(sql, "select max(dir_id) from Dir_Msg"); int max_dir = My_DB->ireturn_serch(sql,1) + 1; char* name = new char[6]; sprintf(name,"MyDir"); sprintf(sql, "insert into DirMsg values(%d,'%s',%d,%d)", max_dir,name, 0, id); ret = My_DB->excute(sql); sprintf(sql, "insert into UserMsg values(%d,%d,'%s',%d)", id, pwd, tel, max_dir); ret = My_DB->excute(sql); DB_Mutex->unlock(); delete sql; return ret; }}bool DB_command::add_file(char* file_name, int owner_id, int pwd,int mode, int dir_id,int change, char* err) {
DB_Mutex->lock(); if (!login_check(owner_id, pwd)) {
strcpy(err, "Have no right!"); DB_Mutex->unlock(); return false; } char* sql = new char[120]; int ret = 0; sprintf(sql, "select owner_id from DirMsg where dir_id = %d", dir_id); if (My_DB->return_serch_num(sql)) {
//再对文件id进行安排 sprintf(sql, "select owner_id from FileMsg where file_name = '%s' and dir_id = %d", file_name, dir_id); if (My_DB->ireturn_serch(sql, 1) == owner_id) {
if (change == 0) {
DB_Mutex->unlock(); strcpy(err, "Duplicate file!"); delete sql; return false; } else {
sprintf(sql, "update FileMsg set file_name = '%s' and mode = %d ", file_name, mode); ret = My_DB->excute(sql); DB_Mutex->unlock(); delete sql; return true; } } else {
sprintf(sql, "select max(file_id) from FileMsg"); int file_id = My_DB->ireturn_serch(sql, 1) + 1; sprintf(sql, "insert into FileMsg values('%s',%d,%d,%d,%d,0)", file_name, owner_id, mode, dir_id, file_id); ret = My_DB->excute(sql); DB_Mutex->unlock(); delete sql; return true; } } else {
DB_Mutex->unlock(); strcpy(err, "dir is not exit!"); delete sql; return false; }}bool DB_command::add_list(int id, int pwd, int father_dir, char* dir_name, char* err) {
DB_Mutex->lock(); if (login_check(id,pwd)) {
char* sql = new char[120]; int ret = 0; sprintf(sql, "select grade from DirMsg where dir_name = '%s'", dir_name); ret = My_DB->ireturn_serch(sql, 1); if (ret == father_dir) {
DB_Mutex->unlock(); strcpy(err, "dir is exit!"); delete sql; return false; } else {
sprintf(sql, "select max(dir_id) from Dir_Msg"); int max_dir = My_DB->ireturn_serch(sql, 1) + 1; sprintf(sql, "insert into DirMsg values(%d,'%s',%d,%d)", max_dir,dir_name,father_dir,id); My_DB->excute(sql); DB_Mutex->unlock(); delete sql; return true; } } else {
DB_Mutex->unlock(); strcpy(err, "Have no right!"); //无权 return false; }} //删bool DB_command::del_user(int user_id,int pwd) {
DB_Mutex->lock(); if (login_check(user_id,pwd)) {
char* sql = new char[120]; sprintf(sql, "delete from UserMsg where id = %d and pwd = %d", user_id, pwd); My_DB->excute(sql); sprintf(sql, "delete from FileMsg where owner_id = %d", user_id); My_DB->excute(sql); sprintf(sql, "delete from DirMsg where owner_id = %d", user_id); My_DB->excute(sql); DB_Mutex->unlock(); delete sql; return true; } else {
DB_Mutex->unlock(); return false; }}bool DB_command::del_file(int user_id, int pwd, char* file_name,int dir_id, char* err) {
DB_Mutex->lock(); if (login_check(user_id, pwd)) {
char* sql = new char[120]; sprintf(sql, "select * from FileMsg where owner_id = %d and file_name = '%s'", user_id, file_name); int ret = My_DB->return_serch_num(sql); if (ret) {
sprintf(sql, "delete from FileMsg where dir_id = %d and file_name = '%s'", dir_id, file_name); My_DB->excute(sql); DB_Mutex->unlock(); delete sql; return true; } else {
DB_Mutex->unlock(); strcpy(err, "Have no right!"); //无权 delete sql; return false; } } else {
DB_Mutex->unlock(); strcpy(err, "Have no right!"); //无权 return false; }}//目前不支持非空文件夹删除操作,不然子又生孙,孙又生子,怎么搞?bool DB_command::del_list(int user_id, int pwd, int dir_id, char* err) {
DB_Mutex->lock(); if (login_check(user_id, pwd)) {
char* sql = new char[120]; sprintf(sql, "select * from FileMsg where owner_id = %d and dir_id = %d", user_id, dir_id); if (!My_DB->return_serch_num) {
sprintf(sql, "select * from DirMsg where grade = %d", dir_id); if (!My_DB->return_serch_num) {
sprintf(sql, "delete from DirMsg where dir_id = %d", dir_id); My_DB->excute(sql); DB_Mutex->unlock(); delete sql; return true; } else {
DB_Mutex->unlock(); strcpy(err, "Directs residual!"); delete sql; return false; } } else {
DB_Mutex->unlock(); strcpy(err, "Files residual!"); delete sql; return false; } } else {
DB_Mutex->unlock(); strcpy(err, "Have no right!"); return false; }}//查bool DB_command::login_check(int user_id, int pwd) {
//哈哈,这个不能上锁 char* sql = new char[120]; sprintf(sql, "select pwd from UserMsg where id = %d", user_id); int ret = My_DB->ireturn_serch(sql,1); delete sql; if (pwd == ret) return true; else return false;}int DB_command::login(int user_id, int pwd, char* err) {
DB_Mutex->lock(); if (login_check(user_id, pwd)) {
char* sql = new char[120]; sprintf(sql, "select dir_id from UserMsg where id = %d", user_id); int ret = My_DB->ireturn_serch(sql, 1); DB_Mutex->unlock(); delete sql; return ret; } else {
DB_Mutex->unlock(); strcpy(err, "Login defeat!"); return false; }}int DB_command::pwd(int user_id, char* tel) {
char* sql = new char[120]; sprintf(sql, "select pwd from UserMsg where id = %d and tel = '%s'", user_id,tel); DB_Mutex->lock(); int ret = My_DB->ireturn_serch(sql,1); DB_Mutex->unlock(); delete sql; return ret;}void DB_command::file_list(int user_id, int pwd, int dir_id, char* ret, char* err){
DB_Mutex->lock(); if (login_check(user_id, pwd)) {
char* sql = new char[150]; sprintf(sql, "select file_id,file_name,FileMsg.[dir_id],dir_name from FileMsg,DirMsg where FileMsg.[owner_id] = %d and FileMsg.[dir_id] = DirMsg.[dir_id]", user_id); My_DB->ret_any(sql, ret); DB_Mutex->unlock(); delete sql; } else {
DB_Mutex->unlock(); strcpy(err, "Have no right!"); }}bool DB_command::download(int user_id, int pwd, char* file_name, int dir_id,int shared, char* err) {
char* sql = new char[120]; if (shared != 0) {
sprintf(sql, "select shared from FileMsg where file_name = '%s' and owner_id = %d", file_name,user_id); DB_Mutex->lock(); int ret = My_DB->ireturn_serch(sql,1); DB_Mutex->unlock(); if (shared == ret) {
delete sql; return true; } } else {
DB_Mutex->lock(); if (login_check(user_id, pwd)) {
sprintf(sql, "select file_id from FileMsg where file_name = '%s' and dir_id = %d", file_name,dir_id); if (My_DB->return_serch_num) {
DB_Mutex->unlock(); delete sql; return true; } else {
DB_Mutex->unlock(); strcpy(err, "Can't find file!"); delete sql; return false; } } else {
DB_Mutex->unlock(); strcpy(err, "Have no right!"); delete sql; return false; } }}//改bool DB_command::cpwd(int user_id, int old_pwd, int new_id, char* err) {
char* sql = new char[120]; sprintf(sql, "update UserMsg set pwd = %d where id = %d and pwd = %d", user_id, old_pwd, new_id); DB_Mutex->lock(); int ret = My_DB->excute(sql); DB_Mutex->unlock(); delete sql; return ret;}bool DB_command::cfile_addr(int user_id, int pwd, char* file_name, int old_dir, int new_dir, char* err) {
DB_Mutex->lock(); if (login_check(user_id, pwd)) {
char* sql = new char[120]; sprintf(sql, "select owner_id from DirMsg where dir_id = %d", new_dir); int id = My_DB->ireturn_serch(sql,1); int ret = 0; if (user_id == id) {
sprintf(sql, "select owner_id from FileMsg where file_name = '%s'", file_name); ret = My_DB->ireturn_serch(sql, 1); if (user_id == id) {
sprintf(sql, "update FileMsg set dir_id = %d where owner_id = %d and dir_id = %d and file_name = '%s'", new_dir, user_id, old_dir, file_name); My_DB->excute(sql); DB_Mutex->unlock(); delete sql; return true; } else {
DB_Mutex->unlock(); strcpy(err, "Have no right!"); delete sql; return false; } } else {
DB_Mutex->unlock(); strcpy(err, "Dir is not exit!"); delete sql; return false; } } else {
DB_Mutex->unlock(); strcpy(err, "Have no right!"); return false; }}bool DB_command::cdir_addr(int user_id, int pwd, char* dir_name, int new_dir, char* err) {
DB_Mutex->lock(); if (login_check(user_id, pwd)) {
char* sql = new char[150]; sprintf(sql, "select grade from DirMsg where dir_id = %d and owner_id = (select owner_id from DirMsg where dir_name = '%s')",new_dir,dir_name); if (My_DB->return_serch_num == 1) {
sprintf(sql, "update DirMsg set where grade = %d", new_dir); My_DB->excute(sql); DB_Mutex->unlock(); delete sql; return true; } else {
DB_Mutex->unlock(); strcpy(err, "Have no right!"); delete sql; return false; } } else {
DB_Mutex->unlock(); strcpy(err, "Have no right!"); return false; } }bool DB_command::share_file(int user_id, int pwd, int shared,char* file_name,int dir_id, char* err) {
DB_Mutex->lock(); if (login_check(user_id, pwd)) {
char* sql = new char[120]; sprintf(sql, "select owner_id from FileMsg where file_name = '%s'",file_name); int id = My_DB->ireturn_serch(sql, 1); if (user_id == id) {
sprintf(sql, "update FileMsg set shared = %d where file_name = '%s' and dir_id = %d", shared, file_name, dir_id); My_DB->excute(sql); DB_Mutex->unlock(); delete sql; return true; } else {
DB_Mutex->unlock(); strcpy(err, "Have no right!"); delete sql; return false; } } else {
DB_Mutex->unlock(); strcpy(err, "Have no right!"); return false; } }bool DB_command::cfile_name(int user_id, int pwd, char* file_name, int file_id,int dir_id, char* err) {
DB_Mutex->lock(); if (login_check(user_id, pwd)) {
char* sql = new char[120]; sprintf(sql, "select owner_id from FileMsg where file_id = %d", file_id); int id = My_DB->ireturn_serch(sql, 1); if (user_id == id) {
sprintf(sql, "update FileMsg set file_name = '%s' where file_id = %d and dir_id = %d", file_name, file_id, dir_id); My_DB->excute(sql); DB_Mutex->unlock(); delete sql; return true; } else {
DB_Mutex->unlock(); strcpy(err, "Have no right!"); delete sql; return false; } } else {
DB_Mutex->unlock(); strcpy(err, "Have no right!"); return false; }}bool DB_command::cdir_name(int user_id, int pwd, char* dir_name, int dir_id, char* err) {
DB_Mutex->lock(); if (login_check(user_id, pwd)) {
char* sql = new char[120]; sprintf(sql, "select owner_id from DirMsg where dir_name = '%s'", dir_name); int id = My_DB->ireturn_serch(sql, 1); if (user_id == id) {
sprintf(sql, "update DirMsg set dir_name = '%s' where dir_id = %d", dir_name, dir_id); My_DB->excute(sql); DB_Mutex->unlock(); delete sql; return true; } else {
DB_Mutex->unlock(); strcpy(err, "Have no right!"); delete sql; return false; } } else {
DB_Mutex->unlock(); strcpy(err, "Have no right!"); return false; }}char* DB_command::dir(int dir_id) {
char* sql = new char[80]; char* ret = new char[60]; strcpy(sql, "select dir_name from DirMsg where dir_id = %d", dir_id); DB_Mutex->lock(); ret = My_DB->creturn_serch(sql, 1); DB_Mutex->unlock(); return ret;}char* DB_command::file(int file_id) {
char* sql = new char[80]; char* ret = new char[60]; strcpy(sql, "select file_name from FileMsg where file_id = %d", file_id); DB_Mutex->lock(); ret = My_DB->creturn_serch(sql, 1); DB_Mutex->unlock(); return ret;}

接下来是为DB服务器与FTP服务器对接而设计的包

//Packet3.h#pragma oncetypedef struct CF {
char cip[16]; char filename[60]; }cf_t; //Client to FTPtypedef struct FC {
char cip[16]; char filename[60]; }fc_t; //FTO to Clienttypedef struct DF {
char filename[60];}df_t; //Delete Filetypedef struct MF {
char oldpath[60]; char newpath[60];}mf_t; //Move File Pathtypedef struct CFN {
char oldname[60]; char newname[60];}cfn_t; //Change File Name//Ŀ¼²¿·Ötypedef struct ND {
char dirname[60];}nd_t; //New Direct typedef struct DD {
char dirname[60];}dd_t; //Delete Directtypedef struct MD {
char olddir[60]; char newdir[60];}md_t; //Move Directtypedef struct CDN {
char olddir[60]; char newdir[60];}cdn_t; //Change Direct Name
//PacketCommand3.h#pragma once//用于DB服务器向FTP服务器发包#include "PacketBase.h"#include "Packet3.h"class PacketCommand3 :	public PacketBase{
public: bool replyCF(char* filename,char* cip); bool replyFC(char* filename,char* cip); bool replyDF(char* filename); bool replyMF(char* oldpath, char* newpath); bool replyCFN(char* oldpath, char* newpath); bool replyND(char* diename); bool replyDD(char* dirname); bool replyMD(char* oldpath, char* newpath); bool replyCDN(char* oldpath, char* newpath);};
//PacketCommand3.cpp#include "PacketCommand3.h"bool PacketCommand3::replyCF(char* filename, char* cip) {
int sz = sizeof(cf_t); this->setBodySize(sz); this->Body = new char[sz]; Head.funcId = 0x12; Head.optid = 0x01; Head.usrlenth = sz; Head.syn = 0x04; strcpy(Head.to_fd, "FTP"); cf_t* body = (cf_t*)Body; strcpy(body->filename, filename); strcpy(body->cip, cip); //到时候大不了转回string Tail.pack_tail = 0x05; return this->pack();}bool PacketCommand3::replyFC(char* filename, char* cip) {
int sz = sizeof(fc_t); this->setBodySize(sz); this->Body = new char[sz]; Head.funcId = 0x13; Head.optid = 0x01; Head.usrlenth = sz; Head.syn = 0x04; strcpy(Head.to_fd, "FTP"); fc_t* body = (fc_t*)Body; strcpy(body->filename, filename); strcpy(body->cip, cip); //到时候大不了转回string Tail.pack_tail = 0x05; return this->pack();}bool PacketCommand3::replyDF(char* filename) {
int sz = sizeof(df_t); this->setBodySize(sz); this->Body = new char[sz]; Head.funcId = 0x17; Head.optid = 0x01; Head.usrlenth = sz; Head.syn = 0x04; strcpy(Head.to_fd, "FTP"); df_t* body = (df_t*)Body; strcpy(body->filename, filename); Tail.pack_tail = 0x05; return this->pack();}bool PacketCommand3::replyMF(char* oldpath, char* newpath) {
int sz = sizeof(mf_t); this->setBodySize(sz); this->Body = new char[sz]; Head.funcId = 0x18; Head.optid = 0x01; Head.usrlenth = sz; Head.syn = 0x04; strcpy(Head.to_fd, "FTP"); mf_t* body = (mf_t*)Body; strcpy(body->oldpath, oldpath); strcpy(body->newpath, newpath); Tail.pack_tail = 0x05; return this->pack();}bool PacketCommand3::replyCFN(char* oldpath, char* newpath) {
int sz = sizeof(cfn_t); this->setBodySize(sz); this->Body = new char[sz]; Head.funcId = 0x20; Head.optid = 0x01; Head.usrlenth = sz; Head.syn = 0x04; strcpy(Head.to_fd, "FTP"); cfn_t* body = (cfn_t*)Body; strcpy(body->oldname, oldpath); strcpy(body->oldname, newpath); Tail.pack_tail = 0x05; return this->pack();}bool PacketCommand3::replyND(char* diename) {
int sz = sizeof(nd_t); this->setBodySize(sz); this->Body = new char[sz]; Head.funcId = 0x15; Head.optid = 0x01; Head.usrlenth = sz; Head.syn = 0x04; strcpy(Head.to_fd, "FTP"); nd_t* body = (nd_t*)Body; strcpy(body->dirname, diename); Tail.pack_tail = 0x05; return this->pack();}bool PacketCommand3::replyDD(char* dirname) {
int sz = sizeof(dd_t); this->setBodySize(sz); this->Body = new char[sz]; Head.funcId = 0x16; Head.optid = 0x01; Head.usrlenth = sz; Head.syn = 0x04; strcpy(Head.to_fd, "FTP"); dd_t* body = (dd_t*)Body; strcpy(body->dirname, dirname); Tail.pack_tail = 0x05; return this->pack();}bool PacketCommand3::replyMD(char* oldpath, char* newpath) {
int sz = sizeof(md_t); this->setBodySize(sz); this->Body = new char[sz]; Head.funcId = 0x19; Head.optid = 0x01; Head.usrlenth = sz; Head.syn = 0x04; strcpy(Head.to_fd, "FTP"); md_t* body = (md_t*)Body; strcpy(body->olddir, oldpath); strcpy(body->newdir, newpath); Tail.pack_tail = 0x05; return this->pack();}bool PacketCommand3::replyCDN(char* oldpath, char* newpath) {
int sz = sizeof(cdn_t); this->setBodySize(sz); this->Body = new char[sz]; Head.funcId = 0x22; Head.optid = 0x01; Head.usrlenth = sz; Head.syn = 0x04; strcpy(Head.to_fd, "FTP"); cdn_t* body = (cdn_t*)Body; strcpy(body->olddir, oldpath); strcpy(body->newdir, newpath); Tail.pack_tail = 0x05; return this->pack();}

接下来是中间操控的主类:

//BackServer.h#pragma once#include"BtoC.h"#include"Pthread_Pool.h"#include"PacketCommand1.h"#include"PacketCommand3.h"#include"DB_command.h"#include
#include
#include
#include
using namespace std;class DoTask : public Task{
public: DoTask(BtoC& send, PacketCommand1& packet); int run();private: DB_command* task_db; BtoC* m_send; PacketCommand1 m_packet; PacketCommand3* f_packet;};class BackServer{
public: BackServer(char* IPnum); ~BackServer() {
} int run();private: PacketCommand1 m_packet; BtoC m_send; Pthread_Pool* m_pool;};
//BackServer.cpp#include "BackServer.h"BackServer::BackServer(char* IPnum){
m_pool = new Pthread_Pool(50, 30, 5); m_send.Start(IPnum); char* name = new char[6]; strcpy(name, "DB"); m_send.send_name(name); delete name;}int BackServer::run(){
int n = 0; while (1) {
n = m_send.Read_date(m_packet.getData()); m_packet.setSize(n); DoTask* t = new DoTask(m_send, m_packet); m_pool->addTask(t); } return 0;}DoTask::DoTask(BtoC& send, PacketCommand1& packet) :m_send(&send), m_packet(packet){
task_db = new DB_command(); f_packet = new PacketCommand3();}int DoTask::run(){
printf("task get data \n"); int tru = 0; //1. unpack m_packet.unpack(); //2. deal the packet by funid void* pData = m_packet.getBody(); char* err = new char[40]; switch (m_packet.getHead()->funcId) {
case 0x01://登陆 {
err = new char[40]; Login_t* plogin = (Login_t*)(pData); tru = task_db->login(plogin->id, plogin->pwd,err); m_packet.replyLogin(tru, tru,err, m_packet.getHead()->fd); m_send->Write_date(m_packet.getData(), m_packet.getSize()); }break; case 0x02://注册 {
Register_t* pregister = (Register_t*)(pData); tru = task_db->add_user(pregister->id, pregister->pwd, pregister->tel,err); m_packet.replyRegist(tru,err,m_packet.getHead()->fd); m_send->Write_date(m_packet.getData(), m_packet.getSize()); }break; case 0x03://找回密码 {
F_Pwd_t* Fpwd = (F_Pwd_t*)(pData); tru = task_db->pwd(Fpwd->id, Fpwd->tel); m_packet.replyFpwd(tru, tru, m_packet.getHead()->fd); m_send->Write_date(m_packet.getData(), m_packet.getSize()); } case 0x04://修改密码 {
c_pwd_t* pc_pwd = (c_pwd_t*)(pData); tru = task_db->cpwd(pc_pwd->id, pc_pwd->pwd, pc_pwd->newpwd,err); m_packet.replyCpwd(tru,err,m_packet.getHead()->fd); m_send->Write_date(m_packet.getData(), m_packet.getSize()); }break; case 0x11: //获取文件列表 {
FileList_t* pfl = (FileList_t*)(pData); char* getList = new char[800]; task_db->file_list(pfl->user_id, pfl->pwd, pfl->dir_id, getList, err); m_packet.replyFileList(err, getList, m_packet.getHead()->fd); m_send->Write_date(m_packet.getData(), m_packet.getSize()); }break; case 0x12: //上传文件 {
UpFile_t* pul = (UpFile_t*)(pData); tru = task_db->add_file(pul->file_name, pul->user_id, pul->pwd, pul->mode, pul->dir_id, pul->force, err); //不论成功与否,客户端都应该知道 m_packet.replyAddList(tru, err, m_packet.getHead()->fd); m_send->Write_date(m_packet.getData(), m_packet.getSize()); //如果成功,那就发往FTP处理 if (true == tru) {
f_packet->replyCF(pul->file_name, pul->ip); m_send->Write_date(f_packet->getData(),f_packet->getSize()); } }break; case 0x13: //下载文件 {
Download_t* pdf = (Download_t*)(pData); tru = task_db->download(pdf->user_id, pdf->pwd, pdf->file_name, pdf->user_id, pdf->shared, err); //不论成功与否,客户端都应该知道 m_packet.replyDownFile(tru, err, m_packet.getHead()->fd); m_send->Write_date(m_packet.getData(), m_packet.getSize()); //如果成功,那就发往FTP处理 if (true == tru){
f_packet->replyFC(pdf->file_name, pdf->ip); m_send->Write_date(f_packet->getData(), f_packet->getSize()); } }break; case 0x14: //共享文件 {
C_mode_t* pcm = (C_mode_t*)(pData); tru = task_db->share_file(pcm->id, pcm->pwd, pcm->share_num, pcm->file_name, pcm->dir_id, err); m_packet.replyShareFile(tru, err, m_packet.getHead()->fd); m_send->Write_date(m_packet.getData(), m_packet.getSize()); }break; case 0x15: //新增目录 {
A_filelist_t* pafl = (A_filelist_t*)(pData); tru = task_db->add_list(pafl->id, pafl->pwd, pafl->father_dir, pafl->dirname, err); if (true == tru) {
f_packet->replyND(pafl->dirname); m_send->Write_date(f_packet->getData(), f_packet->getSize()); } else {
m_packet.replyAddList(tru, err, m_packet.getHead()->fd); m_send->Write_date(m_packet.getData(), m_packet.getSize()); } }break; case 0x16: //删除目录 {
D_list_t* pdl = (D_list_t*)(pData); tru = task_db->del_list(pdl->id, pdl->pwd, pdl->dir_id, err); if (true == tru) {
char* name = new char[60]; name = task_db->dir(pdl->dir_id); f_packet->replyDD(name); m_send->Write_date(f_packet->getData(), f_packet->getSize()); } else {
m_packet.replyDelDir(tru, err, m_packet.getHead()->fd); m_send->Write_date(m_packet.getData(), m_packet.getSize()); } }break; case 0x17: //删除文件 {
D_file_t* pdfl = (D_file_t*)(pData); tru = task_db->del_file(pdfl->id, pdfl->pwd, pdfl->file_name, pdfl->dir_id, err); if (true == tru) {
f_packet->replyDF(pdfl->file_name); m_send->Write_date(f_packet->getData(), f_packet->getSize()); } else {
m_packet.replyDelFile(tru, err, m_packet.getHead()->fd); m_send->Write_date(m_packet.getData(), m_packet.getSize()); } }break; case 0x18: //文件移动 {
C_filelist_t* pcf = (C_filelist_t*)(pData); tru = task_db->cfile_addr(pcf->id, pcf->pwd, pcf->file_name,pcf->old_dir,pcf->new_dir,err); if (true == tru) {
char* oldname = new char[60]; char* newname = new char[60]; oldname = task_db->dir(pcf->old_dir); newname = task_db->dir(pcf->new_dir); f_packet->replyMF(oldname,newname); //这里,需要有id向名字转换的数据库操作函数 m_send->Write_date(f_packet->getData(), f_packet->getSize()); } else {
m_packet.replyMoveFile(tru, err, m_packet.getHead()->fd); m_send->Write_date(m_packet.getData(), m_packet.getSize()); } }break; case 0x19: //目录移动 {
C_Dirlist_t* pcl = (C_Dirlist_t*)(pData); tru = task_db->cdir_addr(pcl->id, pcl->pwd,pcl->dir_name,pcl->new_father, err); if (true == tru) {
char* name = new char[60]; name = task_db->dir(pcl->new_father); f_packet->replyMD(pcl->dir_name,name); //这里 m_send->Write_date(f_packet->getData(), f_packet->getSize()); } else {
m_packet.replyMoveDir(tru, err, m_packet.getHead()->fd); m_send->Write_date(m_packet.getData(), m_packet.getSize()); } }break; case 0x20: //文件重命名 {
C_fileName_t* pfn = (C_fileName_t*)(pData); tru = task_db->cfile_name(pfn->user_id, pfn->pwd, pfn->filename, pfn->file_id,pfn->dir_id,err); if (true == tru) {
char* name = new char[60]; name = task_db->file(pfn->file_id); f_packet->replyCFN(name,pfn->filename); //这里 m_send->Write_date(f_packet->getData(), f_packet->getSize()); } else {
m_packet.replyChangeFileName(tru, err, m_packet.getHead()->fd); m_send->Write_date(m_packet.getData(), m_packet.getSize()); } }break; case 0x22: //目录重命名 {
C_dirName_t* pdn = (C_dirName_t*)(pData); tru = task_db->cdir_name(pdn->user_id, pdn->pwd, pdn->dirname, pdn->dir_id,err); if (true == tru) {
char* name = new char[60]; name = task_db->dir(pdn->dir_id); f_packet->replyCDN(name, pdn->dirname); //这里 m_send->Write_date(f_packet->getData(), f_packet->getSize()); } else {
m_packet.replyChangeDirName(tru, err, m_packet.getHead()->fd); m_send->Write_date(m_packet.getData(), m_packet.getSize()); } }break; return 0; }

场景类相对来说就很简单

//BackCommand.cpp#include"BackServer.h"int main(int argc, char* argv[]) {
BackServer* bk = new BackServer(argv[1]); bk->run();}

在这里插入图片描述

转载地址:https://lion-wu.blog.csdn.net/article/details/107022234 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:以练代学设计模式 -- FTP文件管理项目
下一篇:【Linux】血泪教训 -- 动态链接库配置方法

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年04月20日 08时52分03秒