예제 #1
0
        internal void OdesliPacketu(PacketID id)
        {
            Packeta pac = Packety.ZiskejPacketu(id);

            if (pac == null)
            {
                ZalogujChybu("Neznámá packeta k odeslání: " + id.ToString());
                UkonciSpojeni();
                return;
            }

            if (OdeslanaPacketaUdalost != null)
            {
                OdeslanaPacketaUdalost(id);
            }

            m_RizeniOdesilani.WaitOne();

            try
            {
                pac.ZapisPacketu();
            }
            catch (IndexOutOfRangeException ex)
            {
                ZalogujChybu(ex.ToString());
                UkonciSpojeni();

                return;
            }

            try
            {
                m_Socket.BeginSend(m_Writer.Packeta, 0, m_Writer.Delka, SocketFlags.None, m_OdesliData, null);
            }
            catch (SocketException ex)
            {
                ZalogujChybu(ex.ToString());
                UkonciSpojeni();
            }
            catch (ObjectDisposedException)
            {
            }
        }
예제 #2
0
        public Client()
        {
            m_DelkaPakety = 0;

            //kapacity musí být dělitelné 16 bez zbytku, neboli kapacita % 16 == 0
            m_ReadBuffer   = new byte[1024];
            m_PacketBuffer = new PacketBuffer(2048);

            m_Reader     = new PacketReader(m_PacketBuffer);
            m_PrectiData = new AsyncCallback(PrectiData);

            m_Writer          = new PacketWriter(512);
            m_OdesliData      = new AsyncCallback(OdesliData);
            m_RizeniOdesilani = new AutoResetEvent(true);

            Packety.InicializujPackety(m_Reader, m_Writer, this);

            m_ZkontrolujAktivitu = new TimerCallback(ZkontrolujAktivitu);

            m_Hry                  = new BnetInfoList(2);
            m_CekajiciHry          = new StartedGamesList(2);
            m_OdesliZadostGameList = new TimerCallback(OdesliZadostGameList);
        }
예제 #3
0
        private void PrectiData(IAsyncResult ar)
        {
            try
            {
                m_PocetPrijatychBytu = m_Socket.EndReceive(ar);
            }
            catch (SocketException ex)
            {
                ZalogujChybu(ex.ToString());
                UkonciSpojeni();
            }
            catch (ObjectDisposedException)
            {
                return;
            }
            catch (ArgumentException)
            {
                return;
            }

            if (m_PocetPrijatychBytu > 0)
            {
                NastavAktvitu();

                if (!m_PacketBuffer.VlozData(m_ReadBuffer, m_PocetPrijatychBytu))
                {
                    ZalogujChybu("Přetekl PacketBuffer");
                    UkonciSpojeni();
                    return;
                }
            }
            else
            {
                // ZalogujChybu("Obdržena data o nulové délce");
                // UkonciSpojeni();
                return;
            }

            while (m_PacketBuffer.ObsahujeData)
            {
                switch (m_PacketBuffer.ZiskejPacketu(ref m_DelkaPakety, ref m_PocatecniPozice))
                {
                case StavPackety.NeplatnaHlavicka:
                {
                    ZalogujChybu("Neplatná hlavička (!= 0xFF)");
                    UkonciSpojeni();
                    return;
                }

                case StavPackety.PrilisKratkaPacketa:
                {
                    ZalogujChybu("Příliš krátká packeta");
                    UkonciSpojeni();
                    return;
                }

                case StavPackety.NedostatekDat:
                {
                    try
                    {
                        m_Socket.BeginReceive(m_ReadBuffer, 0, m_ReadBuffer.Length, SocketFlags.None, m_PrectiData, null);
                    }
                    catch (SocketException ex)
                    {
                        ZalogujChybu(ex.ToString());
                        UkonciSpojeni();
                    }

                    return;
                }

                case StavPackety.OK:
                {
                    Packeta pc = Packety.ZiskejPacketu(m_PacketBuffer.Packeta[m_PocatecniPozice + 1]);

                    if (pc == null)
                    {
                        ZalogujChybu("Neznamá packeta ID: " + m_PacketBuffer.Packeta[m_PocatecniPozice + 1].ToString("X2"));
                        UkonciSpojeni();
                        return;
                    }

                    m_Reader.NactiPacketu(m_DelkaPakety, m_PocatecniPozice);

                    try
                    {
                        pc.PrectiPacketu();

                        if (PrijataPacketaUdalost != null)
                        {
                            PrijataPacketaUdalost(pc.ID);
                        }
                    }
                    catch (Exception ex)
                    {
                        ZalogujChybu(ex.ToString());
                        UkonciSpojeni();

                        return;
                    }

                    break;
                }
                }
            }

            try
            {
                m_Socket.BeginReceive(m_ReadBuffer, 0, m_ReadBuffer.Length, SocketFlags.None, m_PrectiData, null);
            }
            catch (SocketException ex)
            {
                ZalogujChybu(ex.ToString());
                UkonciSpojeni();
            }
        }