コード例 #1
0
ファイル: SessionIOCP.cs プロジェクト: Alx666/Netbase
        private void OnRecvCompleted(object hSender, SocketAsyncEventArgs hE)
        {
            try
            {
                if (hE.IsDisconnect())
                {
                    m_hRecvOps.Recycle(hE);
                    throw new SocketException();
                }

                //Begin another Receive Operation
                m_iToDataToConsume += hE.CopyTo(m_hRecvBuffer, ref m_iCurrentOffset); //Warning: race condition with next call

                m_hRecvOps.Recycle(hE);

                byte    bId;
                ushort  uDataSize;
                int     iPacketIndex = 0;

                while (m_hRecvBuffer.ContainsPacket(iPacketIndex, m_iCurrentOffset, m_iToDataToConsume, out bId, out uDataSize))
                {
                    m_hMs.Seek(iPacketIndex + Packet.DataSizeIndex, SeekOrigin.Begin);

                    IAction hAction = Interpreter.Get(bId);

                    hAction.LoadData(m_hReader);

                    iPacketIndex        += Packet.HeaderSize + uDataSize;
                    m_iToDataToConsume  -= Packet.HeaderSize + uDataSize;

                    ServingMode.Execute(hAction);

                    m_hRecvBuffer.Reorder(iPacketIndex, ref m_iCurrentOffset);
                }

                this.StartRecv();
            }
            catch (Exception hEx)
            {
                Console.WriteLine(hEx.Message);
                Service.Recycle(this);
            }
        }