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

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

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


                //m_State.RegisterRecvTraffic(nRecv);

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

                m_module_sec.Recv(m_module_buffer, 0, nRecv);

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


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


                        PacketProcessResult pckRes = m_pck_processor.ProcessModule(pck, this);
                        //pckRes = PacketProcessResult.DoNothing;
                        bool doBreakLoop = false;

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

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

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

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

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

                        if (doBreakLoop)
                        {
                            break;
                        }
                    }

                    ModulePackets.Clear();
                }

                TransferClient();
                DoRecvFromModule();
            }
            catch
            {
                Stop();
            }
        }