public void AsynSendMessage(gNetMsgType msgType, ProtoBuf.IExtensible data) { gNetMsg msg = new gNetMsg() { type = msgType, content = gPB.pbEncode(data), }; msg.size = msg.content.Length; lock (sendQueue) { sendQueue.Enqueue(msg); } }
public static byte[] EncodeHead(gNetMsg msg) { int type = IPAddress.HostToNetworkOrder((int)msg.type); int size = IPAddress.HostToNetworkOrder(msg.size); byte[] typeBytes = BitConverter.GetBytes(type); byte[] sizeBytes = BitConverter.GetBytes(size); byte[] headBytes = new byte[HEAD_BYTES]; Array.Copy(typeBytes, 0, headBytes, OFFSET_TYPE, TYPE_BYTES); Array.Copy(sizeBytes, 0, headBytes, OFFSET_SIZE, SIZE_BYTES); return(headBytes); }
void sendMessageNoPlayerId(gNetMsg msg) { int totalSize = msg.size + gNetMsgHead.HEAD_BYTES; int sendSize = 0; byte[] data = new byte[totalSize]; Array.Copy(gNetMsgHead.EncodeHead(msg), 0, data, 0, gNetMsgHead.HEAD_BYTES); Array.Copy(msg.content, 0, data, gNetMsgHead.HEAD_BYTES, msg.size); while (sendSize < totalSize) { sendSize += clientSocket.Send(data, sendSize, totalSize - sendSize, SocketFlags.None); } }
public static bool DecodeHead(byte[] headBytes, ref gNetMsg msg) { int type, size; if (headBytes.Length >= HEAD_BYTES) { type = BitConverter.ToInt32(headBytes, OFFSET_TYPE); size = BitConverter.ToInt32(headBytes, OFFSET_SIZE); msg.type = (gNetMsgType)IPAddress.NetworkToHostOrder(type); msg.size = IPAddress.NetworkToHostOrder(size); return(true); } return(false); }
//NOT USED ACCORDING TO PROTOCOL void sendMessage(gNetMsg msg) { int totalSize = msg.size + gNetMsgHead.HEAD_BYTES + PAYER_ID_BYTES; int sendSize = 0; Int64 playerId = IPAddress.HostToNetworkOrder(gGlobal.MyPlayerId); byte[] data = new byte[totalSize]; Array.Copy(BitConverter.GetBytes(playerId), 0, data, 0, PAYER_ID_BYTES); Array.Copy(gNetMsgHead.EncodeHead(msg), 0, data, PAYER_ID_BYTES, gNetMsgHead.HEAD_BYTES); Array.Copy(msg.content, 0, data, PAYER_ID_BYTES + gNetMsgHead.HEAD_BYTES, msg.size); while (sendSize < totalSize) { sendSize += clientSocket.Send(data, sendSize, totalSize - sendSize, SocketFlags.None); } }
public bool GetOneNetMsg(out gNetMsg msg) { msg = new gNetMsg(); if (!gNetMsgHead.DecodeHead(this.buffer, ref msg)) { return(false); } int remain = this.bufferOffset - gNetMsgHead.HEAD_BYTES - msg.size; if (remain < 0) { return(false); } if (msg.size > 0) { msg.content = new byte[msg.size]; Array.Copy(this.buffer, gNetMsgHead.HEAD_BYTES, msg.content, 0, msg.size); } if (remain == 0) { this.bufferOffset = 0; this.buffer.Initialize(); } else { byte[] residual = new byte[remain]; Array.Copy(this.buffer, this.bufferOffset - remain, residual, 0, remain); this.buffer.Initialize(); Array.Copy(this.buffer, 0, residual, 0, remain); this.bufferOffset = remain; } return(true); }