Exemple #1
0
        // 发送消息
        public bool SendAsync(UnityUtility.CBuffer outBuffer)
        {
            if (m_socket == null || !m_socket.Connected)
            {
                return(false);
            }

            uint dataSize = (uint)outBuffer.ReadSize;
            uint dataPos  = 0;

            lock (m_sendBuffer)
            {
                while (dataSize > 0)
                {
                    uint cmdFlag = GNET_PACKET_FLAG;
                    uint cmdLen  = 0;
                    if (dataSize > GNET_PACKET_LEN)
                    {
                        cmdFlag |= GNET_PACKET_NEXT;
                        cmdLen   = GNET_PACKET_LEN;
                    }
                    else
                    {
                        cmdLen = dataSize;
                    }
                    cmdFlag = (cmdFlag & GNET_PACKET_SIGN) | cmdLen;

                    byte[] cmdFlagBytes = System.BitConverter.GetBytes(cmdFlag);
                    if (!m_sendBuffer.Write(cmdFlagBytes, 0, cmdFlagBytes.Length))
                    {
                        return(false);
                    }
                    if (!m_sendBuffer.Write(outBuffer.BufferHead, (int)dataPos, (int)cmdLen))
                    {
                        return(false);
                    }
                    dataSize -= cmdLen;
                    dataPos  += cmdLen;
                }
            }
            if (_SendBufferToNet() >= 0)
            {
                return(true);
            }

            UnityUtility.CTrace.Singleton.debug("发送消息失败, 断开连接");

            Disconnect(0);
            _PushPacket(CNetPacket.EType.CONNECTION_LOST, "");

            return(false);
        }
Exemple #2
0
        private int _MergerPacket(UnityUtility.CBuffer inBuffer, out uint outBufferFlag, out UnityUtility.CBuffer outBuffer)
        {
            int  readIndex = inBuffer.ReadIndex;
            uint cmdFlag   = System.BitConverter.ToUInt32(inBuffer.BufferHead, readIndex);
            uint flag      = cmdFlag & GNET_PACKET_SIGN;
            uint len       = cmdFlag & GNET_PACKET_LEN;
            uint dataSize  = len + sizeof(uint);

            outBuffer     = null;
            outBufferFlag = 0;

            while ((flag & GNET_PACKET_NEXT) != 0)
            {
                if (dataSize + sizeof(uint) > inBuffer.ReadSize)
                {
                    return(0);
                }
                cmdFlag   = System.BitConverter.ToUInt32(inBuffer.BufferHead, (int)dataSize + readIndex);
                len       = cmdFlag & GNET_PACKET_LEN;
                flag      = cmdFlag & GNET_PACKET_SIGN;
                dataSize += len + sizeof(uint);
            }
            if (dataSize > inBuffer.ReadSize)
            {
                return(0);
            }
            outBuffer = new UnityUtility.CBuffer();

            cmdFlag  = System.BitConverter.ToUInt32(inBuffer.BufferHead, readIndex);
            flag     = cmdFlag & GNET_PACKET_SIGN;
            len      = cmdFlag & GNET_PACKET_LEN;
            dataSize = len + sizeof(uint);

            outBufferFlag = cmdFlag;
            uint readPos = sizeof(uint);

            while ((flag & GNET_PACKET_NEXT) != 0)
            {
                outBuffer.Write(inBuffer.BufferHead, (int)readPos, (int)len);
                readPos += len;

                cmdFlag   = System.BitConverter.ToUInt32(inBuffer.BufferHead, (int)dataSize + readIndex);
                len       = cmdFlag & GNET_PACKET_LEN;
                flag      = cmdFlag & GNET_PACKET_SIGN;
                dataSize += len + sizeof(uint);
                readPos  += sizeof(uint);
            }
            outBuffer.Write(inBuffer.BufferHead, (int)readPos + readIndex, (int)len);
            inBuffer.ReadFlip((int)dataSize);

            return(outBuffer.ReadSize);
        }
Exemple #3
0
        private void _PushPacket(UnityUtility.CBuffer buffer)
        {
            CNetPacket packet = new CNetPacket();

            packet.m_packetType = CNetPacket.EType.CONNECTION_RECV_PACKET;
            packet.m_peer       = m_socket;
            packet.m_buffer     = buffer;

            lock (m_packetQueue)
            {
                m_packetQueue.Enqueue(packet);
            }
        }
Exemple #4
0
        private void CallbackRecvAsync(UnityUtility.CBuffer buffer)
        {
            m_stream.Buffer = buffer;
            uint id = 0;

            if (!m_stream.Read(ref id))
            {
                UnityUtility.CTrace.Singleton.debug("解析消息ID错误");
                m_netTcpClient.Disconnect();
                return;
            }
            UnityFrame.CMsgID msgID   = new UnityFrame.CMsgID(id);
            UnityFrame.CMsg   msgData = CGameClient.Singleton.MsgFactory.CreateMessageByMsgID(msgID);
            if (msgData != null)
            {
                UnityUtility.CTrace.Singleton.debug("解析消息[{0}.{1}.{2}][{3}]", msgID.ServerType.ServerType, msgID.FuncType.FuncType, msgID.MsgNumber, msgData.ToString());

                if (!msgData.SerializeFrom(m_stream))
                {
                    m_netTcpClient.Disconnect();
                    return;
                }
                if (m_stream.Buffer.CanRead)
                {
                    UnityUtility.CTrace.Singleton.error("解析消息ParseMessage[{0}.{1}.{2}]失败,消息还有多余数据", msgID.ServerType.ServerType, msgID.FuncType.FuncType, msgID.MsgNumber);
                    m_netTcpClient.Disconnect();
                    return;
                }
                if (!CGameClient.Singleton.MsgExecMgr.ParseMessage(msgData))
                {
                    UnityUtility.CTrace.Singleton.error("解析消息ParseMessage[{0}.{1}.{2}][{3}]失败", msgID.ServerType.ServerType, msgID.FuncType.FuncType, msgID.MsgNumber, msgData.ToString());
                    m_netTcpClient.Disconnect();
                    return;
                }
            }
            else
            {
                UnityUtility.CTrace.Singleton.error("解析消息ParseMessage[{0}.{1}.{2}]创建消息失败", msgID.ServerType.ServerType, msgID.FuncType.FuncType, msgID.MsgNumber);
                m_netTcpClient.Disconnect();
                return;
            }
        }
Exemple #5
0
        // 接收消息回调
        private void _ReceiveCallback(System.IAsyncResult ar)
        {
            try
            {
                int readSize = m_socket.EndReceive(ar);

                // 服务器断开连接
                if (readSize <= 0)
                {
                    Disconnect(0);
                    _PushPacket(CNetPacket.EType.CONNECTION_LOST, "");
                    return;
                }
                //收到数据,写入缓存
                m_recvBuffer.Write(m_netRecvBuffer, 0, readSize);

                do
                {
                    int buffReadSize = m_recvBuffer.ReadSize;
                    if (buffReadSize < 4)
                    {
                        m_socket.BeginReceive(m_netRecvBuffer, 0, m_netRecvBuffer.Length, SocketFlags.None, new System.AsyncCallback(_ReceiveCallback), m_netRecvBuffer);
                        return;
                    }
                    //合并数据包
                    UnityUtility.CBuffer outBuffer = null;
                    uint cmdFlag = 0;
                    int  res     = _MergerPacket(m_recvBuffer, out cmdFlag, out outBuffer);
                    if (res < 0)
                    {
                        Disconnect(0);
                        _PushPacket(CNetPacket.EType.CONNECTION_CLOSE, "");
                        return;
                    }
                    else if (res == 0)
                    {
                        m_socket.BeginReceive(m_netRecvBuffer, 0, m_netRecvBuffer.Length, SocketFlags.None, new System.AsyncCallback(_ReceiveCallback), m_netRecvBuffer);
                        return;
                    }

                    //uint cmdFlag = System.BitConverter.ToUInt32(outBuffer.BufferHead, 0);
                    uint flag = cmdFlag & GNET_PACKET_SIGN;
                    uint len  = cmdFlag & GNET_PACKET_LEN;
                    //数据包标志
                    if ((flag & GNET_PACKET_FLAG) == 0)
                    {
                        Disconnect(0);
                        _PushPacket(CNetPacket.EType.CONNECTION_CLOSE, "");
                        return;
                    }
                    //数据包加密
                    if ((flag & GNET_PACKET_ENCRYPT) != 0)
                    {
                        Disconnect(0);
                        _PushPacket(CNetPacket.EType.CONNECTION_CLOSE_ENCRYPT, "");
                        return;
                    }
                    //数据压缩
                    if ((flag & GNET_PACKET_COMPRESS) != 0)
                    {
                        Disconnect(0);
                        _PushPacket(CNetPacket.EType.CONNECTION_CLOSE_COMPRESS, "");
                        return;
                    }
                    _PushPacket(outBuffer);
                }while (true);
            }
            catch (System.Exception e)
            {
                _PushPacket(CNetPacket.EType.CONNECTION_LOST, e.Message);
                Disconnect(0);
            }
        }