/* Sog 游戏基础库 2016 by zouwei */ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace Sog { /// /// 底层控制类型,65500开始 /// public enum SpecialMessageType { /// /// Server->Server 服务器cluster连上后的第一个消息,注册用 /// ClusterClientRegister = 32750, /// /// Gate -> Server的消息 /// GateMsgHeaderType = 32751, /// /// Server->Server 大消息 /// BigMessageStart = 32752, /// /// Server->Server 大消息 /// BigMessageTrans = 32753, /// /// 公钥 /// PublicKey = 32760, /// /// 加密钥匙,tea /// SessionKey = 32761, } /// /// 打包后的消息头是变长的,有可能是2+2+4=8(主要和客户端使用) 有可能是2+2+4+8=16(主要服务器使用) /// public struct MessageHeader { public int Length; // 数据长度(不包括消息头自己,后面跟的数据的长度,数据长度可以为0,这种情况表示只有头信息,没有实际数据) public int Type; // 类型 public uint ServerID; // 自定义ID,服务器ID public long ObjectID; // 自定义ID,和逻辑有关,一般是玩家ID,sessionID,GlobalID等 public bool isZip; // 消息是否压缩, 不打包到通信协议中 } public struct MessageCachedBuffer { //是否使用cache public bool UseCache; //数据在Data中的开始位置 public int Pos; //数据长度,必须要有这个,实际数据长度和byte[]数组长度并不相同,一定注意了 public int Length; // 打包后的数据,UseCache情况下请不要用Data.Length,这个是不对的 public byte[] Data; } public class MessageData { //消息头信息 public MessageHeader Header; // 打包后的数据 public MessageCachedBuffer Buffer; public MessageData() { // new struct调用默认构造函数进行struct初始化, 否则字段初始化前struct不可用 Header = new MessageHeader(); } public void MallocData(int size) { this.Buffer.Data = Sog.Memory.ByteArrayCacheMgr.Instance.Malloc(size); this.Buffer.Length = size; this.Buffer.UseCache = true; } public void FreeData() { if(Buffer.UseCache && Buffer.Data != null) { Sog.Memory.ByteArrayCacheMgr.Instance.Free(this.Buffer.Data); } this.Buffer.Data = null; this.Buffer.Pos = 0; this.Buffer.Length = 0; this.Buffer.UseCache = false; } public MessageData Clone() { MessageData newMD = new MessageData(); newMD.Header = this.Header; newMD.MallocData(this.Buffer.Length); System.Buffer.BlockCopy(this.Buffer.Data, 0, newMD.Buffer.Data, 0, this.Buffer.Length); return newMD; } } }