RunGate有三个Socket对象 一个向M2发送 一个接收客户端的连接。还有一个连接控制台(当然这个是和控制台绑定的通常手动启动是不需要的 只是在私服这方面方便私服架设 者使用)
控制台Socket会每隔一段时间向控制台发送保活包。如果没有发送 那么控制台肯定是知道rungate没反应了或者被关闭了 然后可以立马又开启。纯粹是为了私服假者简单而考 虑。
实际只有2个Socket对象才是最主要的。M2Sokcet和ClientSocket。
整个结构当然是使用的典型生产者消费者模型。 但是代码结构很不清晰.而且消息的处理是使用Timer来处理,而不是线程。
程序在通过一个常量定义了在栈上的会话数量。当程序开始运行会 在栈上有一个数组 保存会话信息。 会话信息是一个结构体,内部记录了会话的信息,比如连接时间,封包大小
以及 上次移动时间 上次通讯时间等等。
当有客户端连接时候。会在预分频的数组内找到一个未使用的空间。初始化这个数组的内容 将当前的客户端连接保持在这个会话之内。
当收到客户端的信息时候,会进行一系列合法的验证 或者保护。最终将消息生成一个消息体:
ReviceMsgList.Add(UserData); //加入收到的消息列表内。
收收到服务端的消息的时候。将消息头部 转换成如下消息格式:
TMsgHeader = packed record
dwCode: LongWord;
nSocket: Integer;
wGSocketIdx: Word;
wIdent: Word;
wUserListIndex: Integer;
nLength: Integer;
end;
记录了消息的类型 长度 和Socket句柄等消息。根据wIdent的值
case pMsg.wIdent