xxxxxxxxxx
691// 公共模块
2// 定义所有模块都会用到的宏和数据类型
3//
4
5
6
7//
8// 函数返回值
9//
10// 成功
11// 本地错误
12// 套接字通信错误
13// 服务器状态异常
14//
15// 缓存
16//
17// 跟踪服务器Redis前缀
18// 存储服务器Redis前缀
19//
20// 存储服务器状态
21//
22typedef enum storage_status {
23 STORAGE_STATUS_OFFLINE, // 存储服务器离线
24 STORAGE_STATUS_ONLINE, // 存储服务器在线
25 STORAGE_STATUS_ACTIVE // 存储服务器活动
26} storage_status_t; // 存储服务器状态
27//
28// 存储服务器加入和信息
29//
30// 版本最大字符数
31// 组名最大字符数
32// 主机名最大字符数
33// 地址最大字符数
34
35typedef struct storage_join {
36 char sj_version[STORAGE_VERSION_MAX+1]; // 版本
37 char sj_groupname[STORAGE_GROUPNAME_MAX+1]; // 组名
38 char sj_hostname[STORAGE_HOSTNAME_MAX+1]; // 主机名
39 in_port_t sj_port; // 端口号
40 time_t sj_stime; // 启动时间
41 time_t sj_jtime; // 加入时间
42} storage_join_t; // 存储服务器加入
43
44typedef struct storage_info {
45 char si_version[STORAGE_VERSION_MAX+1]; // 版本
46 char si_hostname[STORAGE_HOSTNAME_MAX+1]; // 主机名
47 char si_addr[STORAGE_ADDR_MAX+1]; // IP地址
48 in_port_t si_port; // 端口号
49 time_t si_stime; // 启动时间
50 time_t si_jtime; // 加入时间
51 time_t si_btime; // 心跳时间
52 storage_status_t si_status; // 状态
53} storage_info_t; // 存储服务器信息
54//
55// ID键值对
56//
57// 键最大字符数
58
59typedef struct id_pair {
60 char id_key[ID_KEY_MAX+1]; // 键
61 long id_value; // 值
62 int id_offset; // 偏移
63} id_pair_t; // ID键值对
64//
65// 存储服务器读写磁盘文件缓冲区
66//
67// 接收写入缓冲区字节数
68// 读取发送缓冲区字节数
xxxxxxxxxx
611// 公共模块
2// 定义与报文规约有关的宏和数据类型
3//
4
5
6
7//
8// |包体长度|命令|状态| 包体 |
9// | 8 | 1 | 1 |包体长度|
10//
11// 包体长度字节数
12// 命令字节数
13// 状态字节数
14// 包头长度
15//
16// |包体长度|命令|状态|错误号|错误描述|
17// | 8 | 1 | 1 | 2 | <=1024 |
18//
19// 错误号字节数
20// 错误描述最大字节数(含结尾空字符)
21//
22// |包体长度|命令|状态|应用ID|用户ID|文件ID|
23// | 8 | 1 | 1 | 16 | 256 | 128 |
24//
25// 应用ID最大字节数(含结尾空字符)
26// 用户ID最大字节数(含结尾空字符)
27// 文件ID最大字节数(含结尾空字符)
28//
29// 存储服务器加入包和心跳包
30//
31typedef struct storage_join_body {
32 char sjb_version[STORAGE_VERSION_MAX+1]; // 版本
33 char sjb_groupname[STORAGE_GROUPNAME_MAX+1]; // 组名
34 char sjb_hostname[STORAGE_HOSTNAME_MAX+1]; // 主机名
35 char sjb_port[sizeof(in_port_t)]; // 端口号
36 char sjb_stime[sizeof(time_t)]; // 启动时间
37 char sjb_jtime[sizeof(time_t)]; // 加入时间
38} storage_join_body_t; // 存储服务器加入包体
39
40typedef struct storage_beat_body {
41 char sbb_groupname[STORAGE_GROUPNAME_MAX+1]; // 组名
42 char sbb_hostname[STORAGE_HOSTNAME_MAX+1]; // 主机名
43} storage_beat_body_t; // 存储服务器心跳包体
44//
45// 命令
46//
47// 存储服务器向跟踪服务器发送加入包
48// 存储服务器向跟踪服务器发送心跳包
49// 客户机从跟踪服务器获取存储服务器地址列表
50// 客户机从跟踪服务器获取组列表
51
52// 存储服务器从ID服务器获取ID
53
54// 客户机向存储服务器上传文件
55// 客户机向存储服务器询问文件大小
56// 客户机从存储服务器下载文件
57// 客户机删除存储服务器上的文件
58
59// 跟踪服务器应答
60// ID服务器应答
61// 存储服务器应答
xxxxxxxxxx
281// 公共模块
2// 声明几个实用函数
3//
4
5
6
7
8
9// long long类型整数主机序转网络序
10void llton(long long ll, char* n);
11// long long类型整数网络序转主机序
12long long ntoll(char const* n);
13
14// long类型整数主机序转网络序
15void lton(long l, char* n);
16// long类型整数网络序转主机序
17long ntol(char const* n);
18
19// short类型整数主机序转网络序
20void ston(short s, char* n);
21// short类型整数网络序转主机序
22short ntos(char const* n);
23
24// 字符串是否合法,即是否只包含26个英文字母大小写和0到9十个阿拉伯数字
25int valid(char const* str);
26
27// 以分号为分隔符将一个字符串拆分为多个子字符串
28int split(char const* str, std::vector<std::string>& substrs);
1// 公共模块
2// 定义几个实用函数
3//
4
5
6
7
8// long long类型整数主机序转网络序
9void llton(long long ll, char* n) {
10 for (size_t i = 0; i < sizeof(ll); ++i)
11 n[i] = ll >> (sizeof(ll) - i - 1) * 8;
12}
13
14// long long类型整数网络序转主机序
15long long ntoll(char const* n) {
16 long long ll = 0;
17 for (size_t i = 0; i < sizeof(ll); ++i)
18 ll |= (long long)(unsigned char)n[i] << (sizeof(ll) - i - 1) * 8;
19 return ll;
20}
21
22// long类型整数主机序转网络序
23void lton(long l, char* n) {
24 for (size_t i = 0; i < sizeof(l); ++i)
25 n[i] = l >> (sizeof(l) - i - 1) * 8;
26}
27
28// long类型整数网络序转主机序
29long ntol(char const* n) {
30 long l = 0;
31 for (size_t i = 0; i < sizeof(l); ++i)
32 l |= (long)(unsigned char)n[i] << (sizeof(l) - i - 1) * 8;
33 return l;
34}
35
36// short类型整数主机序转网络序
37void ston(short s, char* n) {
38 for (size_t i = 0; i < sizeof(s); ++i)
39 n[i] = s >> (sizeof(s) - i - 1) * 8;
40}
41
42// short类型整数网络序转主机序
43short ntos(char const* n) {
44 short s = 0;
45 for (size_t i = 0; i < sizeof(s); ++i)
46 s |= (short)(unsigned char)n[i] << (sizeof(s) - i - 1) * 8;
47 return s;
48}
49
50// 字符串是否合法,即是否只包含26个英文字母大小写和0到9十个阿拉伯数字
51int valid(char const* str) {
52 if (!str)
53 return ERROR;
54
55 size_t len = strlen(str);
56 if (!len)
57 return ERROR;
58
59 for (size_t i = 0; i < len; ++i)
60 if (!(('a' <= str[i] && str[i] <= 'z') ||
61 ('A' <= str[i] && str[i] <= 'Z') ||
62 ('0' <= str[i] && str[i] <= '9')))
63 return ERROR;
64
65 return OK;
66}
67
68// 以分号为分隔符将一个字符串拆分为多个子字符串
69int split(char const* str, std::vector<std::string>& substrs) {
70 if (!str)
71 return ERROR;
72
73 size_t len = strlen(str);
74 if (!len)
75 return ERROR;
76
77 char* buf = new char[len+1];
78 strcpy(buf, str);
79
80 char const* sep = ";";
81 for (char* substr = strtok(buf, sep); substr;
82 substr = strtok(NULL, sep))
83 substrs.push_back(substr);
84
85 delete[] buf;
86
87 return OK;
88}