//********************************************************************************************* // 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; } }