Exemple #1
0
        private void RecvData(DataEventArgs dataEventArgs)
        {
            int rlen = dataEventArgs.Length - dataEventArgs.Offset;

            if (rlen > 0)
            {
                if (packageTrigger)
                {
                    /// annalyze the package head
                    if (rlen >= NetUtils.MSG_HEADER_LEN)
                    {
                        Array.Copy(dataEventArgs.Data, dataEventArgs.Offset, headData, headDataLen, NetUtils.MSG_HEADER_LEN - headDataLen);

                        using (MemoryStream ms = new MemoryStream(headData))
                        {
                            using (BinaryReader br = new BinaryReader(ms))
                            {
                                br.ReadByte();
                                int msgLen = br.ReadInt32();
                                if (!adapter.IsLittleEnd())
                                {
                                    msgLen = msgLen.SwapInt32();
                                }

                                totalLength = NetUtils.MSG_HEADER_LEN + msgLen;
                            }
                        }

                        if (totalLength <= 0)
                        {
                            Debugger.LogError("total len <= 0 close->" + totalLength);
                            onClosed(null, null);
                        }

                        if (totalLength > cacheRecvData.Length)
                        {
                            cacheRecvData = new byte[totalLength];
                        }
                    }
                }

                if (totalLength <= 0)
                {
                    headDataLen = dataEventArgs.Length - dataEventArgs.Offset;
                    Array.Copy(dataEventArgs.Data, dataEventArgs.Offset, headData, 0, headDataLen);
                    return;
                }

                int bufLen = 0;
                int blen   = totalLength - currentLength;
                if (rlen >= blen)
                {
                    bufLen = blen;

                    if (headDataLen > 0)
                    {
                        Array.Copy(headData, 0, cacheRecvData, currentLength, headDataLen);
                        currentLength += headDataLen;
                        bufLen        -= headDataLen;
                        headDataLen    = 0;
                    }
                }
                else
                {
                    bufLen = rlen;
                }

                Array.Copy(dataEventArgs.Data, dataEventArgs.Offset, cacheRecvData, currentLength, bufLen);
                currentLength        += bufLen;
                dataEventArgs.Offset += bufLen;

                if (totalLength > currentLength)
                {
                    packageTrigger = false;
                }
                else if (rlen > bufLen)
                {
                    packageTrigger = true;
                    Deserialize(cacheRecvData, totalLength);
                    Clear();
                    RecvData(dataEventArgs);
                }
                else if (rlen == bufLen)
                {
                    packageTrigger = true;
                    Deserialize(cacheRecvData, totalLength);
                    Clear();
                }
                else if (totalLength < currentLength)
                {
                    onClosed(null, null);
                }
            }
            total++;
        }
Exemple #2
0
        private void RecvData(DataEventArgs dataEventArgs)
        {
            int rlen = dataEventArgs.Length - dataEventArgs.Offset;

            if (rlen > 0)
            {
                if (packageTrigger)
                {
                    if (rlen >= NetUtils.MSG_HEADER_LEN)
                    {
                        Array.Copy(dataEventArgs.Data, dataEventArgs.Offset, headData, headDataLen, NetUtils.MSG_HEADER_LEN - headDataLen);

                        using (MemoryStream ms = new MemoryStream(headData))
                        {
                            using (BinaryReader br = new BinaryReader(ms))
                            {
                                br.ReadByte();
                                int msgLen = br.ReadInt32();
                                if (!adapter.IsLittleEnd())
                                {
                                    msgLen = msgLen.SwapInt32();
                                }

                                totalLength = NetUtils.MSG_HEADER_LEN + msgLen;
                            }
                        }

                        if (totalLength <= 0)
                        {
                            Debugger.LogError("total len <= 0 close->" + totalLength);
                        }

                        if (totalLength > currentBody.Length)
                        {
                            currentBody = new byte[totalLength];
                        }
                    }
                }

                if (totalLength <= 0)
                {
                    headDataLen = dataEventArgs.Length - dataEventArgs.Offset;
                    Array.Copy(dataEventArgs.Data, dataEventArgs.Offset, headData, 0, headDataLen);
                    return;
                }

                int bufLen = 0;
                int blen   = totalLength - currentLength;
                if (rlen >= blen)
                {
                    bufLen = blen;

                    if (headDataLen > 0)
                    {
                        Array.Copy(headData, 0, currentBody, currentLength, headDataLen);
                        currentLength += headDataLen;
                        bufLen        -= headDataLen;
                        headDataLen    = 0;
                    }
                }
                else
                {
                    bufLen = rlen;
                }

                //Debug.Log("analysis data 10->" + bufLen + "^" + dataEventArgs.Offset + "^" + currentLength);
                Array.Copy(dataEventArgs.Data, dataEventArgs.Offset, currentBody, currentLength, bufLen);
                currentLength        += bufLen;
                dataEventArgs.Offset += bufLen;

                //Debugger.Log("analysis data 11->" + totalLength + "^" + currentLength + "^" + rlen + "^" + bufLen);
                if (totalLength > currentLength)
                {
                    //Debug.Log("analysis data 12");
                    packageTrigger = false;
                }
                else if (rlen > bufLen)
                {
                    packageTrigger = true;
                    Deserialize(currentBody, totalLength);
                    Clear();
                    RecvData(dataEventArgs);
                }
                else if (rlen == bufLen)
                {
                    //Debug.Log("analysis data 13");
                    packageTrigger = true;
                    //_dataHandler(currentBody);
                    Deserialize(currentBody, totalLength);
                    Clear();
                }
                else if (totalLength < currentLength)
                {
                    //Debug.LogError("total len < currentLen close->" + TotalLength + "^" + currentLength);
                }
            }
            total++;
        }