Example #1
0
        override protected void OnRead(byte[] data, int len, ref EndPoint addr)
        {
            byte[] msg = null;
            Packet msgPk = null;
            int    pos = 0, size = 0, msglen;

            try
            {
                if (0 < length)
                {
                    size = length + len;

                    if (PACKAGE_HEADER_SIZE > size)
                    {
                        if (BUFFER_SIZE >= size)
                        {
                            Array.Copy(data, 0, buffer, length, len);
                            length = size;
                        }
                        else
                        {
                            Debug.LogWarning("Close===========2");
                            close();
                        }
                        return;
                    }

                    if (PACKAGE_HEADER_SIZE > length)
                    {
                        pos = PACKAGE_HEADER_SIZE - length;
                        Array.Copy(data, 0, buffer, length, pos);
                        length += pos;
                        len    -= pos;
                    }

                    //message version
                    if (PACKAGE_IDENTIFY == buffer[0])
                    {
                        //msg length
                        msglen = BitConverter.ToInt16(buffer, 2);
                        msglen = IPAddress.NetworkToHostOrder((short)msglen);

                        if (length + len >= msglen)
                        {
                            size = msglen - length;
                            msg  = new byte[msglen - PACKAGE_HEADER_SIZE];
                            Array.Copy(buffer, PACKAGE_HEADER_SIZE, msg, 0, length - PACKAGE_HEADER_SIZE);
                            Array.Copy(data, pos, msg, length - PACKAGE_HEADER_SIZE, size);
                            pos       += size;
                            len       -= size;
                            msgPk      = new Packet();
                            msgPk.data = (0 == buffer[1]) ? AESCrypt.Decrypt(msg, AESCrypt.KEY) : msg;
                            DEBUG.NetworkServer(data[1], data);
                            if (null != msgPk.data)
                            {
                                ev.WaitOne();
                                list.Add(msgPk);
                                ev.Set();
                            }
                            else
                            {
                                Debug.LogWarning("Close========3");
                                close();
                                return;
                            }
                        }
                        else
                        {
                            size = length + len;
                            if (BUFFER_SIZE >= size)
                            {
                                Array.Copy(data, pos, buffer, length, len);
                                length = size;
                            }
                            else
                            {
                                Debug.LogWarning("Close========4");
                                close();
                            }
                            return;
                        }
                    }
                    else
                    {
                        Debug.LogWarning("Close=========5");
                        close();
                        return;
                    }
                }

                while (PACKAGE_HEADER_SIZE <= len)
                {
                    //message version
                    if (PACKAGE_IDENTIFY == data[pos])
                    {
                        //msg length
                        msglen = BitConverter.ToInt16(data, pos + 2);
                        msglen = IPAddress.NetworkToHostOrder((short)msglen);

                        if (BUFFER_SIZE < msglen)
                        {
                            Debug.LogWarning("Close=========6");
                            close();
                            return;
                        }
                        else if (len >= msglen)
                        {
                            msg = new byte[msglen - PACKAGE_HEADER_SIZE];
                            Array.Copy(data, pos + PACKAGE_HEADER_SIZE, msg, 0, msg.Length);
                            msgPk      = new Packet();
                            msgPk.data = (0 == data[pos + 1]) ? AESCrypt.Decrypt(msg, AESCrypt.KEY) : msg;
                            pos       += msglen;
                            len       -= msglen;

                            if (null != msgPk.data)
                            {
                                ev.WaitOne();
                                list.Add(msgPk);
                                ev.Set();
                            }
                            else
                            {
                                Debug.LogWarning("Close=========7");
                                close();
                                return;
                            }
                        }
                        else
                        {
                            break;
                        }
                    }
                    else
                    {
                        Debug.LogWarning("Close=========8");
                        close();
                        return;
                    }
                }

                Array.Copy(data, pos, buffer, 0, len);
                length = len;
            }
            catch (Exception e)
            {
                DEBUG.Networking(DEBUG.TRACER_LOG + "NetConnection.OnRead, exp: " + e.Message, LogType.Exception);
            }
        }