Ejemplo n.º 1
0
        //*********************************************************************************************
        // ReadCallBack / Revisto pela última vez em 01/08/2016, criado por Allyson S. Bacon
        // Ler informações recebidas.
        //*********************************************************************************************
        public static void ReadCallback(IAsyncResult ar)
        {
            //EXTEND
            if (Extensions.ExtensionApp.ExtendMyApp
                    (MethodBase.GetCurrentMethod().Name, ar) != null)
            {
                return;
            }

            //CÓDIGO
            String content = String.Empty;
            // state = clients[i].
            // handler = clients[i].async
            StateObject state   = (StateObject)ar.AsyncState;
            Socket      handler = state.Async;


            if (handler == null)
            {
                return;
            }
            ; if (!handler.Connected)
            {
                return;
            }
            if (state.index < 0)
            {
                return;
            }

            int clientid = UserConnection.Getindex(state.index);

            //Se ultrapassar os limites, fechar conexão.
            if ((clientid < 0) || (clientid > Clients.Count - 1))
            {
                return;
            }

            int index = Clients[clientid].index;
            // Clients[Clients.Count - 1].Ansyc.EndReceive(ar)

            //Obtenção da informação
            int buffersize = GetPendingByteCount(handler);

            if (buffersize > 1000)
            {
                if (PStruct.character[index, PStruct.player[index].SelectedChar].Access < 1)
                {
                    Console.WriteLine(lang.player_buffer_limit_exceeded);
                    return;
                }
            }
            // Ler informações do cliente
            try
            {
                //Finalizar o recebimento para começar a ler
                int bytesRead = handler.EndReceive(ar);

                //Se tiver dados para ler.
                if (bytesRead > 0)
                {
                    //Tem dados, então vamos processa-los
                    state.sb.Append(Encoding.UTF8.GetString(
                                        state.buffer, 0, bytesRead));

                    // Passamos tudo para uma váriavel ler.
                    content = state.sb.ToString();

                    // Extender APP / Cancelar Thread atual para executar a próxima?
                    Extensions.ExtensionApp.ExtendMyApp(index, content);

                    //Enviamos os dados para o SelectPacket
                    ReceiveData.SelectPacket(index, content);

                    //Limpar a stream de dados pois já foram processados.
                    state.sb.Clear();
                }

                //Voltamos a receber os dados.
                handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                                     new AsyncCallback(ReadCallback), state);
            }
            catch (SocketException e)
            {
                if (e.ErrorCode == 10054)
                {
                    //A conexão será fechada logo pela outra thread, então apenas aguardar.
                    return;
                }
                Console.WriteLine(lang.connection_critical_error);
                Database.LogError(e);
                return;
            }
            catch (Exception e)
            {
                Console.WriteLine(lang.player_critical_error);
                Database.LogError(e);
                return;
            }
        }