public int Send(long conn_idx, PacketBase packet)
        {
            m_send_by.Clear();
            m_send_by.WriteUShort(0);//先写入长度占位
            packet.Write(m_send_by);
            int len = NetConnectManager.Instance.Send(conn_idx, m_send_by);

            PacketPools.Recover(packet);
            return(len);
        }
        /// <summary>
        /// 发消息给client
        /// </summary>
        /// <param name="conn_idx"></param>
        /// <param name="packet"></param>
        /// <returns></returns>
        public int Send(long conn_idx, PacketBase packet)
        {
            int size = 0;

            if (m_net_socket != null)
            {
                m_send_by.Clear();
                m_send_by.WriteUShort(0);//先写入长度占位
                packet.Write(m_send_by);
                size = m_net_socket.Send(conn_idx, m_send_by);
            }
            PacketPools.Recover(packet);
            return(size);
        }
        /// <summary>
        /// 发包
        /// </summary>
        /// <param name="conn_idx"></param>
        /// <param name="packet"></param>
        public void Send(long conn_idx, PacketBase packet)
        {
            if (m_sockets.Contains(conn_idx))
            {
                //包索引
                uint packet_idx = 0;
                if (packet is PackBaseC2S)
                {
                    packet_idx = PacketEncrypt.GetPacketIndex();
                    (packet as PackBaseC2S).packet_idx = PacketEncrypt.EncrpytPacketIndex(packet_idx, GlobalID.ENCRYPT_KEY);
                }

                m_send_by.Clear();
                m_send_by.WriteUShort(0);//先写入长度占位
                packet.Write(m_send_by);
                int data_len = m_send_by.Available - NetID.PacketHeadSize;
                m_send_by.ModifyUShort((ushort)data_len, 0);

                //数据有效性
                if (packet is PackBaseC2S)
                {
                    //包长2 + 协议头2 + 包索引id4 + 有效性校验2 = 10
                    ushort data_verify = PacketEncrypt.CalcPacketDataVerify(m_send_by.Buffer, 10, m_send_by.Available - 10, packet_idx, GlobalID.ENCRYPT_KEY);
                    m_send_by.ModifyUShort((ushort)data_verify, 8);
                }

                int size = NetConnectManager.Instance.Send(conn_idx, m_send_by);
                m_send_msg_count++;
                m_send_msg_size += size;
            }

            PacketPools.Recover(packet);
        }
        /// <summary>
        /// 查询信息
        /// </summary>
        public static void QueryDBEvent(long char_idx, DBID db_id, Action <List <DBEventInfo> > callback)
        {
            List <DBEventInfo> list = new List <DBEventInfo>();
            ByteArray          by   = DBUtils.AllocDBArray();
            string             sql  = "call SP_DB_EVENT_LOAD(" + char_idx + ")";

            DBManager.Instance.GetDB(eDBType.Game, db_id.game_id).Query(sql, (reader) =>
            {
                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                        DBEventInfo info     = new DBEventInfo();
                        info.event_idx       = reader.GetInt64(0);
                        info.target_char_idx = reader.GetInt64(1);
                        info.source_char_idx = reader.GetInt64(2);
                        info.event_type      = (eDBEventType)reader.GetByte(3);
                        //内容
                        by.Clear();
                        long len = reader.GetBytes(4, 0, null, 0, int.MaxValue);
                        reader.GetBytes(4, 0, by.Buffer, 0, (int)len);
                        by.WriteEmpty((int)len);
                        info.bin_content.Read(by);

                        list.Add(info);
                    }
                }
                callback(list);
            });
        }
Пример #5
0
        /// <summary>
        /// 发包
        /// </summary>
        /// <param name="conn_idx"></param>
        /// <param name="packet"></param>
        public void Send(PacketBase packet)
        {
            if (m_cur_conn_idx > 0)
            {
                //包索引
                uint packet_idx = 0;
                if (packet is PackBaseC2S)
                {
                    packet_idx = PacketEncrypt.GetPacketIndex();
                    (packet as PackBaseC2S).packet_idx = PacketEncrypt.EncrpytPacketIndex(packet_idx, GlobalID.ENCRYPT_KEY);
                }

                //数据写入stream
                m_send_by.Clear();
                m_send_by.WriteUShort(0);                                  //先写入长度占位
                packet.Write(m_send_by);
                int data_len = m_send_by.Available - NetID.PacketHeadSize; //总长度
                m_send_by.ModifyUShort((ushort)data_len, 0);

                //数据有效性
                if (packet is PackBaseC2S)
                {
                    //包长2 + 协议头2 + 包索引id4 + 有效性校验2 = 10
                    ushort data_verify = PacketEncrypt.CalcPacketDataVerify(m_send_by.Buffer, 10, m_send_by.Available - 10, packet_idx, GlobalID.ENCRYPT_KEY);
                    m_send_by.ModifyUShort((ushort)data_verify, 8);
                }

                NetConnectManager.Instance.Send(m_cur_conn_idx, m_send_by);
            }

            PacketPools.Recover(packet);
        }
Пример #6
0
 protected void ParsePacket()
 {
     while (m_by_buffer.Available >= NetID.PacketHeadSize)
     {
         if (m_by_buffer.Peek(ref head_by, NetID.PacketHeadSize))
         {
             ushort msg_length = BitConverter.ToUInt16(head_by, 0);
             if (m_by_buffer.Available >= msg_length + NetID.PacketHeadSize)
             {
                 //读取包数据
                 m_by_buffer.Skip(NetID.PacketHeadSize);
                 ushort header = m_by_buffer.ReadUShort();
                 m_dispatcher_buffer.Clear();
                 int len = m_by_buffer.Read(m_dispatcher_buffer, msg_length - sizeof(ushort));
                 if (len != msg_length - sizeof(ushort))
                 {
                     Log.Error("读取错误");
                     m_by_buffer.Skip(msg_length - sizeof(ushort));//跳到下一个位置
                     continue;
                 }
                 //派发数据
                 if (m_net_socket != null && m_net_socket.OnReceive != null)
                 {
                     m_net_socket.OnReceive(m_conn_idx, header, m_dispatcher_buffer);
                 }
             }
             else
             {
                 break;
             }
         }
         else
         {
             break;
         }
     }
 }
Пример #7
0
 public override void Init()
 {
     base.Init();
     data.Clear();
 }
Пример #8
0
 public static ByteArray AllocDBArray()
 {
     tmpDBArray.Clear();
     return(tmpDBArray);
 }
Пример #9
0
 public static ByteArray AllocSendPacket()
 {
     tmpSendBy.Clear();
     tmpSendBy.WriteUShort(0);//协议头,包长度
     return(tmpSendBy);
 }