协议收发
协议就是进程之间通信的内容。
进程通信方式
进程之间使用INetworkModule提供的工具进行网络通信。它通过一个回调器(IEngineNetCallback)获取通信的内容,我们需要自己实现这个回调器。
我们将协议作为通信的内容,从一个进程发送到另一个进程,另一个进程收到协议后,需要根据协议号进行识别,然后做出相应的处理。
协议的定义 = 协议头 + 协议内容
一个协议文件的格式是:
#ifndef __MSG_TEST_H__
#define __MSG_TEST_H__
#include "msgheader.h"
#include "msgcode.h"
#pragma pack(push)
#pragma pack(4)
namespace Protocol
{
class CSTest
{
public:
CSTest() : header(MT_TEST_CS) {}
MessageHeader header;
char buffer[1024];
};
}
#pragma pack(pop)
#endif // __MSG_TEST_H__
以下代码片段表示其中的结构体定义将以4字节对齐。
#pragma pack(push)
#pragma pack(4)
//...
#pragma pack(pop)
确定字节对齐长度并让数据成员紧凑排列是很重要的,这样才能确保另一端的进程正确解析该协议。
如果我们的结构体的成员没有紧凑排列,或者没有确定的字节对齐长度,那么会出现什么问题?、
协议都有一个协议头(MessageHeader),它通过绑定一个协议号来标识该协议,一个协议必须拥有唯一的协议号。
协议处理的流程
协议处理的代码占据服务端编程内容的大部分。它的流程大致是:客户端发送协议 -> 服务端接收协议并安排处理函数处理 -> 服务端返回处理结果协议。
如果你在编写逻辑代码,这个流程很可能是:
ServerNetworkCallback::OnRecv
World::OnRecv
SceneManager::OnRecv
MessageHandler::HandleMessage
MessageHandler::yourfunctions // 你自己定义的处理函数