服务器进程之间会有大量的消息,如何有条理的定义消息是一个比较重要的问题。一种思路是按照每个服务器进程收到的消息进行区分,例如:
#pragma pack(1)
namespace MyCmd
{
namespace FunctionCmd //表示function收到的消息,类似的可以定义scene收到的消息SceneCmd等。
{
namespace Cmd
{
enum {
min_func_cmd = 100,
cmd_test_scenefunction,
...
max_func_cmd = 10000,
};
};
struct CMD_DEC(cmd_test_scenefunction, FunctionCmd::Cmd) {
int test = 0;
int datasize = 0;
unsigned char data[0];
cmd_test_scenefunction(){}
int get_cmd_size() {
return sizeof(*this) + datasize;
}
};
};
};
#pragma pack()
其中CMD_DEC是个宏定义:
define CMD_DEC(cmd_name, namespace) \
cmd_name : public CmdTemplate<MyCmd::namespace::cmd_name>
其中CmdTemplate是个模板,定义如下:
template <int cmd>
struct CmdTemplate : public VoidCmd
{
enum {
cmdid = cmd
};
CmdTemplate() : VoidCmd(cmdid) {}
};
struct VoidCmd : public _void_cmd
{
explicit VoidCmd(int cmdid) : _void_cmd(cmdid)
};
struct _void_cmd
{
explicit _void_cmd(int cmdid) : _cmd_id(cmdid) {}
int _cmd_id;//用来标识消息的id号
};