Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }