Analisis de Sb0t 5.38

Iniciado por Nolohagan, 6 Abril 2017, 11:29 AM

0 Miembros y 2 Visitantes están viendo este tema.

Nolohagan

Hola,

estaba interesado en un determinado aumento y me gustario decir de que se trata ya que con "determinado aumento" nadie entendera nada.

Bueno para eso quisieres mostrarle un pedazo de codigo de Sb0t 5.38:

El pedazo es demasiado largo asi que se los mostrare desde una pagina web:

https://github.com/AresChat/sb0t/blob/v5.38/core/AresClient.cs

Bueno concentremonos en el metodo de desconeccion que vendira siendo el proceso de ban:

Código (csharp) [Seleccionar]

public void Disconnect(bool ghost)
       {
           while (this.data_out.Count > 0)
           {
               try
               {
                   byte[] packet;

                   if (this.data_out.TryPeek(out packet))
                   {
                       this.Sock.Send(packet);
                       Stats.DataSent += (ulong)packet.Length;

                       while (!this.data_out.TryDequeue(out packet))
                           continue;
                   }
                   else break;
               }
               catch { break; }
           }

           try { this.Sock.Disconnect(false); }
           catch { }
           try { this.Sock.Shutdown(SocketShutdown.Both); }
           catch { }
           try { this.Sock.Close(); }
           catch { }
           try { this.Sock.Dispose(); }
           catch { }

           this.SocketConnected = false;

           if (!ghost)
               this.SendDepart();
           else if (this.LoggedIn && !this.Quarantined)
           {
               this.LoggedIn = false;
               Events.Parting(this);

               if (ServerCore.Linker.Busy && ServerCore.Linker.LoginPhase == LinkLeaf.LinkLogin.Ready)
                   ServerCore.Linker.SendPacket(LinkLeaf.LeafOutbound.LeafPart(ServerCore.Linker, this));

               Events.Parted(this);
           }

           this.LoggedIn = false;
       }


Y es este aumento:

while (this.data_out.Count > 0)

el data_out.Count el que me interesa. Porque el unico metodo en el que se puede ver un aumento(porque sino siempre tiene menos) es este:


public void SendPacket(byte[] packet)
       {
           this.data_out.Enqueue(packet);
       }


Y en este metodo SendPacket..... que es lo que se hace para que se aumente el dato_out?


Gracias y saludos

MCKSys Argentina

Creo que debes analizar el tipo d variable que es this.data_out antes que nada.

Según el link que pusiste:

Código (csharp) [Seleccionar]
private ConcurrentQueue<byte[]> data_out = new ConcurrentQueue<byte[]>();

Entonces, debes analizar la clase ConcurrentQueue: https://msdn.microsoft.com/en-us/library/dd267265(v=vs.110).aspx

De ahí seguro evacúas tus preguntas.

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Nolohagan

Cita de: MCKSys Argentina en  6 Abril 2017, 14:48 PM


Entonces, debes analizar la clase ConcurrentQueue: https://msdn.microsoft.com/en-us/library/dd267265(v=vs.110).aspx


oh dios mio, porque no puedo suicidar?

Viste que largo es el articulo?

Tengo que aprender todos los metodos, propiedades, implemenos interfaces, constructores de ConcurrentQueue(T). Tu te las sabes todas?


MCKSys Argentina

Cita de: Nolohagan en  6 Abril 2017, 16:48 PM
Tu te las sabes todas?

No. En mi caso trato de aprender lo que hace la clase en gral. y los metodos/propiedades que necesito.

Para eso, debes leer la documentación...

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Nolohagan

Ok,

listo. Ahora ya analize el tipo de variable. Sigamos por favor.

En el metodo SendPacket..... que es lo que se hace para que se aumente el dato_out?

Gracias hermano

MCKSys Argentina

Cita de: Nolohagan en  6 Abril 2017, 17:24 PM
Ok,

listo. Ahora ya analize el tipo de variable. Sigamos por favor.

En el metodo SendPacket..... que es lo que se hace para que se aumente el dato_out?

Gracias hermano

Lee la documentación:

Código (csharp) [Seleccionar]
public void SendPacket(byte[] packet)
        {
            this.data_out.Enqueue(packet);
}


Citar
System_CAPS_pubmethod   Enqueue(T)   

Adds an object to the end of the ConcurrentQueue<T>.

Info del método: https://msdn.microsoft.com/en-us/library/dd287262(v=vs.110).aspx

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Nolohagan

Si ya se eso.

Lo que yo queria saber es que hace que la cantidad crezca. El metodo se llama SendPacket osea cada vez que el servidor envie paquetes al cliente creze la cantidad o que?

Gracias

MCKSys Argentina

Cita de: Nolohagan en  6 Abril 2017, 17:59 PM
Si ya se eso.

Lo que yo queria saber es que hace que la cantidad crezca. El metodo se llama SendPacket osea cada vez que el servidor envie paquetes al cliente creze la cantidad o que?

Gracias

Mira el ejemplo de la documentación de la clase (el link que te dí al principio). Está al final de todo. Con eso deberías entender cómo funciona la cosa.

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Eleкtro

#8
El compañero @MCKSys Argentina ya te lo ha dicho todo. data_out es un objeto de tipo cola (Queue), algo parecido a la representación abstracta de una pila (Stack) en .NET, cuando se añade un elemento a la cola, la propiedad Count del objeto aumenta, evidéntemente.

Cita de: Nolohagan en  6 Abril 2017, 11:29 AMen este metodo SendPacket..... que es lo que se hace para que se aumente el dato_out?

Se añade un nuevo elemento ( byte[] ) al final de la cola, por ende, la cola (data_out) aumenta.

Cita de: Nolohagan en  6 Abril 2017, 11:29 AM
Código (csharp) [Seleccionar]
while (this.data_out.Count > 0)

Esa instrucción viene a decir: "Mientras exista algún elemento en la cola..."

PD: ¿Es esto lo que preguntabas?.

¡Saludos!








Nolohagan

Hola,

no. En realidad esa era la parte que ya sabia. Entras palabras:

Ustedes vieren que mientras data_out no este en 0 no se podra dsconectar a un usuario y de este modo banearlo.

Entonces.... que tiene que hacer el servidor o el cliente para que data_out no quede en 0? Enviar paquetes.

Ya sa que la respuesta es: el servidor tiene que aumentar data_out. Pero de que manera?

Gracias :)