示例#1
0
        private PacketResult GetPacketResultOnClientPacketReceived(SROClient client, SROPacket packet)
        {
            //For ClientlessSwitcher
            if (this.m_client.CanSwitchClient)
            {
                #region Fake Client

                #region 0x2001
                if (packet.Opcode == 0x2001)
                {
                    //[S -> C][2001][16 bytes]
                    //0D 00 47 61 74 65 77 61 79 53 65 72 76 65 72 00   ..GatewayServer.
                    Packet response = new Packet(0x2001);
                    if (!this.m_client.IsConnectedToAgent)
                    {
                        response.WriteAscii("GatewayServer");
                    }
                    else
                    {
                        response.WriteAscii("AgentServer");
                        this.m_client.IsConnectedToAgent = false;
                    }
                    response.WriteByte(0); //Client-Connection
                    response.Lock();

                    client.SendPacket(response);

                    response = new Packet(0x2005, false, true);
                    response.WriteByte(0x01);
                    response.WriteByte(0x00);
                    response.WriteByte(0x01);
                    response.WriteByte(0xBA);
                    response.WriteByte(0x02);
                    response.WriteByte(0x05);
                    response.WriteByte(0x00);
                    response.WriteByte(0x00);
                    response.WriteByte(0x00);
                    response.WriteByte(0x02);
                    response.Lock();

                    client.SendPacket(response);

                    response = new Packet(0x6005, false, true);
                    response.WriteByte(0x03);
                    response.WriteByte(0x00);
                    response.WriteByte(0x02);
                    response.WriteByte(0x00);
                    response.WriteByte(0x02);
                    response.Lock();

                    client.SendPacket(response);
                }
                #endregion

                #region 0x6100
                if (packet.Opcode == 0x6100)
                {
                    byte   local    = packet.ReadByte();
                    string identity = packet.ReadAscii();
                    uint   version  = packet.ReadUInt();

                    //S->P:A100 Data:01
                    Packet response = new Packet(0xA100, false, true);

                    if (local != this.m_client.LocaleID)
                    {
                        response.WriteByte(0x02);
                        response.WriteByte(0x01); //(C4)
                    }
                    else if (identity != "SR_Client")
                    {
                        response.WriteByte(0x02);
                        response.WriteByte(0x03); //(C4)
                    }
                    else if (version != this.m_client.VersionID)
                    {
                        response.WriteByte(0x02);
                        response.WriteByte(0x02);
                    }
                    else
                    {
                        response.WriteByte(0x01); //Success
                    }

                    response.Lock();
                    client.SendPacket(response);
                }
                #endregion

                #region 0x6101

                if (packet.Opcode == 0x6101 && this.m_client.IsConnectedToAgent == false)
                {
                    Packet response = new Packet(0xA102);
                    response.WriteByte(0x01);          //Success
                    response.WriteUInt(uint.MaxValue); //SessionID
                    response.WriteAscii("127.0.0.1");  //AgentIP
                    response.WriteUShort(this.m_client.LocalPort);
                    response.Lock();

                    this.m_client.IsConnectedToAgent = true;
                    client.SendPacket(response);
                }

                #endregion

                #region 0x6103

                if (packet.Opcode == 0x6103)
                {
                    uint   sessionID = packet.ReadUInt();
                    string username  = packet.ReadAscii();
                    string password  = packet.ReadAscii();
                    byte   local     = packet.ReadByte();
                    //byte[] mac = packet.ReadByteArray(6); //No need

                    Packet response = new Packet(0xA103);
                    if (sessionID != uint.MaxValue)
                    {
                        response.WriteByte(0x02);
                        response.WriteByte(0x02);
                    }
                    else if (!string.IsNullOrEmpty(username))
                    {
                        response.WriteByte(0x02);
                        response.WriteByte(0x02);
                    }
                    else if (!string.IsNullOrEmpty(password))
                    {
                        response.WriteByte(0x02);
                        response.WriteByte(0x02);
                    }
                    else if (local != this.m_client.LocaleID)
                    {
                        response.WriteByte(0x02);
                        response.WriteByte(0x02);
                    }
                    else
                    {
                        response.WriteByte(0x01); //Success
                    }
                    response.Lock();
                    client.SendPacket(response);
                }

                #endregion

                #region 0x7007

                if (packet.Opcode == 0x7007)
                {
                    byte type = packet.ReadByte();
                    if (type == 0x02)
                    {
                        Packet responseEndCS = new Packet(0xB001);
                        responseEndCS.WriteByte(0x01);

                        Packet responseInitLoad = new Packet(0x34A5);

                        client.SendPacket(responseEndCS);
                        client.SendPacket(responseInitLoad);
                        this.m_client.IsWaitingForData = true;
                    }
                }

                #endregion

                #endregion
            }
            else
            {
                //Not sure why but after clientless->client the clients preferes to send 0x6103 twice.
                if (packet.Opcode == 0x6103)
                {
                    if (this.m_client.AgentLoginFixCounter > 0)
                    {
                        return(new PacketResult(PacketOperationType.IGNORE));
                    }
                    this.m_client.AgentLoginFixCounter++;
                }

                if (packet.Opcode == 0x6102)
                {
                    this.m_client.AgentLoginFixCounter = 0;
                }

                return(new PacketResult(PacketOperationType.NOTHING));

                //if (this.m_client.IsConnectedToAgent) {
                //    this.m_agentComponent.
                //    m_agentSocket.Send(packet);
                //} else {
                //    m_gatewaySocket.Send(packet);
                //}
            }

            return(new PacketResult(PacketOperationType.NOTHING));
        }