Example #1
0
        //-----------------------------------------------------------------------------

        //Хэндлим пакеты от клиента к модулю
        void DoRecvFromClientCallback(IAsyncResult iar)
        {
            try
            {
                int nRecv = m_args.ClientSocket.EndReceive(iar);

                if (nRecv == 0)
                {
                    Stop();
                    return;
                }


                //m_State.RegisterRecvTraffic(nRecv);

                Global.TotalBytesIn += (ulong)(nRecv);

                //process Client -> Module
                m_client_sec.Recv(m_client_buffer, 0, nRecv);

                List <Packet> ClientPackets = m_client_sec.TransferIncoming();
                if (ClientPackets != null)
                {
                    for (int i = 0; i < ClientPackets.Count; i++)
                    {
                        var pck = ClientPackets[i];


                        //Даём SSA хэндлить внутренние пакеты
                        if (pck.Opcode == 0x9000 || pck.Opcode == 0x5000 || pck.Opcode == 0x2001)
                        {
                            continue;
                        }

                        PacketProcessResult pckRes = m_pck_processor.ProcessClient(pck, this);

                        bool doBreakLoop = false;

                        switch (pckRes)
                        {
                        case PacketProcessResult.ContinueLoop:
                        {
                            continue;
                        }

                        case PacketProcessResult.BreakLoop:
                        {
                            doBreakLoop = true;
                        }
                        break;

                        case PacketProcessResult.Disconnect:
                        {
                            //Console.WriteLine("Stop called from Disconnect");
                            Stop();
                            return;
                        }

                        case PacketProcessResult.DoNothing:
                        {
                            m_module_sec.Send(pck);
                            continue;
                        }

                        default:
                        {
                            //PacketProcessResult.Unknown
                        }
                        break;
                        }

                        if (doBreakLoop)
                        {
                            break;
                        }
                    }
                }


                TransferModule();
                DoRecvFromClient();
            }
            catch
            {
                Stop();
            }
        }