private SkynetClusterRequest UnpackNormalRequestPacket(byte[] data) { SkynetClusterRequest request = new SkynetClusterRequest(); // unpack header byte tag = 0; string name = ""; int nameLength = 0; int session = 0; UnpackHeader(data, out tag, out name, out nameLength, out session); int startIndex = nameLength + 6; // unpack message: protoId and message buffer int byteCount = 0; int protoId = (int)UnpackInteger(data, startIndex, out byteCount); startIndex += 1 + byteCount; byte[] msg = UnpackString(data, startIndex); request.ProtoId = protoId; request.ServiceName = name; request.Session = session; request.Data = msg; return(request); }
public SkynetClusterRequest UnpackSkynetRequest(byte[] msg) { SkynetClusterRequest request = null; byte tag = msg[0]; switch (tag) { case (byte)RequestPacketTag.NORMAL_PACKET: { request = UnpackNormalRequestPacket(msg); } break; case (byte)RequestPacketTag.LARGE_PACKET: case (byte)RequestPacketTag.FRAGMENT: case (byte)RequestPacketTag.LAST_FRAGMENT: case (byte)RequestPacketTag.LARGE_PUSH: { request = UnpackLargeRequestPacket((RequestPacketTag)tag, msg); } break; default: { LoggerHelper.Info(m_sourceId, String.Format("Unknow request tag {0}", tag)); } break; } return(request); }
private SkynetClusterRequest UnpackLargeRequestPacket(RequestPacketTag tag, byte[] data) { SkynetClusterRequest request = null; switch (tag) { case RequestPacketTag.LARGE_PACKET: case RequestPacketTag.LARGE_PUSH: { // unpack header byte tempTag = 0; string name = ""; int nameLength = 0; int session = 0; UnpackHeader(data, out tempTag, out name, out nameLength, out session); if (m_largeRequestPackets.ContainsKey(session)) { LoggerHelper.Info(m_sourceId, String.Format("SkynetPacketManager.UnpackLargePacket multi header for same session {0}", session)); m_largeRequestPackets.Remove(session); } int startIndex = nameLength + 6; int totalDataSize = data[startIndex + 3] << 24 | data[startIndex + 2] << 16 | data[startIndex + 1] << 8 | data[startIndex]; SkynetLargePacket largeRequest = new SkynetLargePacket(); largeRequest.ServiceName = name; largeRequest.Session = session; largeRequest.Tag = (int)tempTag; largeRequest.TotalDataSize = totalDataSize; largeRequest.Messages = new List <SkynetMessage>(); largeRequest.Type = LargePacketType.REQUEST; m_largeRequestPackets.Add(session, largeRequest); } break; case RequestPacketTag.FRAGMENT: case RequestPacketTag.LAST_FRAGMENT: { int session = data[4] << 24 | data[3] << 16 | data[2] << 8 | data[1]; int size = data.Length - 5; byte[] msg = new byte[size]; Array.Copy(data, 5, msg, 0, size); SkynetMessage skynetMessage = new SkynetMessage(); skynetMessage.Data = msg; skynetMessage.Size = size; SkynetLargePacket largeRequest = null; bool isSuccess = m_largeRequestPackets.TryGetValue(session, out largeRequest); if (!isSuccess) { LoggerHelper.Info(m_sourceId, String.Format("SkynetPacketManager.UnpackLargePacket illegal FRAGMENT {0}", session)); return(null); } largeRequest.Messages.Add(skynetMessage); if (tag == RequestPacketTag.LAST_FRAGMENT) { byte[] messageBuf = new byte[largeRequest.TotalDataSize]; int startIndex = 0; int sumBytes = 0; for (int i = 0; i < largeRequest.Messages.Count; i++) { SkynetMessage tempMsg = largeRequest.Messages[i]; Array.Copy(tempMsg.Data, 0, messageBuf, startIndex, tempMsg.Size); startIndex += tempMsg.Size; sumBytes += tempMsg.Size; } if (largeRequest.TotalDataSize != sumBytes) { LoggerHelper.Info(m_sourceId, String.Format("SkynetPacketManager.UnpackLargePacket large packet totalsize is not equal to real size {0}", session)); } // unpack message: protoId and message buffer startIndex = 0; int byteCount = 0; int protoId = (int)UnpackInteger(messageBuf, startIndex, out byteCount); startIndex += 1 + byteCount; byte[] unpackMsg = UnpackString(messageBuf, startIndex); request = new SkynetClusterRequest(); request.ProtoId = protoId; request.ServiceName = largeRequest.ServiceName; request.Session = session; request.Data = unpackMsg; m_largeRequestPackets.Remove(session); } } break; default: break; } return(request); }