1.今日任务
包的收发
完成情况:完成一半
2.包的协议
#ifndef I_PACKET_PUBLIC_H
#define I_PACKET_PUBLIC_H
#include
#include
using namespace std;
#define MAX_LEN 256
/接入层数据包头/
typedef struct packet_header_st
{
int fd;//用于前后端通信即目标客户端fd(服务器用到)
int funcId; // 功能号
//登录包0x01,注册包0x02,找回密码0x03,修改密码0x04
//客户端获取文件列表0x11,上传文件0x12,下载文件0x13,共享文件0x14
//心跳0x21
int optid; // 操作码:请求0x00 和 应答0x01
int usrlenth;// 包体的长度
int packet_seq; //包序号
int packet_sum; //包总数
char srcAddr[6]; //预留
char dstAddr[6]; //预留
int syn; // 判断包头是否正确 0x04
}packet_header_t;
/接入层数据包尾/
typedef struct packet_tali_st//包尾,用来验证数据包的完整性
{
int pack_tail;//设置为0x05
}packet_tali_t;
/数据包报文整体/
typedef struct packet_all_st
{
packet_header_t head;
char body[packet_header_t::usrlenth];
packet_tali_st tail;
//unsigned len; //要发送的数据有效长度
}packet_all_st;
/业务层数据包体/
//客户端登录请求包
typedef struct login
{
int id;
char psw[10]; //密码
}Login_t;
//登录应答包
typedef struct res_login_st
{
int login_ret; //登录结果: 1-登录成功,0-登录失败
int dir_id; //初始文件列表id
}res_login_t;
//客户端注册请求包
typedef struct Register
{
int id; //账号
char tel[12]; //11位手机号
char psw[10]; //密码
}Register_t;
//注册应答包
typedef struct res_register_st
{
int register_ret; //注册结果: 0-注册成功,1-注册失败
}res_register_t;
//客户端修改密码请求包
typedef struct Change_PWD
{
int id; //账号
char psw[10]; //密码
}c_pwd_t;
//改密码应答包
typedef struct res_changepwd_st
{
int change_ret; //改密码结果: 0-改密码成功,1-改密码失败
}res_cpwd_t;
//找回密码请求包
typedef struct findpwd
{
int id;
char tel[12];
}F_Pwd_t;
//找回密码应答包
typedef struct res_findpwd_st
{
int find_ret; //找回结果: 0-找回成功,1-找回失败
char pwd[20]; //密码
}res_fpwd_t;
//销户请求包
typedef struct deluser
{
int id;
int pwd;
}D_user_t;
/文件相关******/
//上传文件请求包
typedef struct UpFile
{
int user_id;
int dir_id;
int mode; //文件权限位
int pwd;
char *file_name;
}UpFile_t;
//下载文件请求包
typedef struct Download_File
{
int user_id; //用户ID
int pwd;
char* file_name; //文件id
}Download_t;
//权限修改
typedef struct Cmode
{
int id;
int pwd;
int mode;
char* file_name;
}C_mode_t;
//新建目录
typedef struct AddFileList
{
int id;
int pwd;
int father_dir; //挂载在哪一级目录底下
char* dirname;
}
//修改文件目录
typedef struct CFileList
{
int id;
int pwd;
int old_dir;
int new_dir;
char* file_name;
}C_filelist_t;
//删除文件
typedef struct delfile
{
int id;
int pwd;
char *file_name;
}D_file_t;
//删除目录
typedef struct dellist
{
int id;
int pwd;
int dir_id
}D_list_t;
//文件、目录总应答
typedef res_fl
{
int stata; //0成1败
}res_fl_t;
//文件列表请求包
typedef struct File_List
{
int user_id; //用户ID
int pwd;
int dir_id; //目录id
}FileList_t;
//文件列表应答包
typedef struct Res_VideoList
{
char V[800];
}res_filelist;
#endif // PACKET_BASE_H
3.遇到问题
协议中的黄色部分如果这么写,会出现数组边缘并非整数的报错,这是一位usrlenth是一个变量
这时候可以改为char *body;
因为是我们规定的是不定长包,所以要判断一下包头,包尾,和包体长度
登陆请求包的压缩