GS-Zone

[ DESTACADO ] Por qué nunca usar Exit Sub en paquetes que contengan datos adicionales. Ir al Indice

Moderadores: Moderadores de Argentum, Especialistas de Argentum, Especialistas de Programación

16

Nota » 04 Sep 2010 22:25

Error demasiado común cuando se inmersan en el mundo del protocolo binario en el Argentum.

Estamos acostumbrados a poner la típica:
  1. If UserList(UserIndex).flags.Muerto = 1 Then
  2.                       Call WriteConsoleMsg(UserIndex, "¡¡Estás muerto!!", FONTTYPE_INFO)
  3.                       Exit Sub
  4.               End If

Ahora, ¿cuál es el problema con esto?
Ninguno, dependiendo de qué paquete se trate. Si el paquete únicamente contiene bytes y variables númericas, no es necesario realizar una copia al buffer ni nada. Por eso, los paquetes que contengan esto:
  1.        Call .incomingData.ReadByte

Y no hagan ninguna copia al buffer, no tiene problemas en utilizar Exit Sub. Pero la cosa cambia si utilizamos un paquete que contiene strings. Un paquete que contiene más de un dato y cadenas strings utiliza esto:
  1.        Dim buffer As New clsByteQueue
  2.         Call buffer.CopyBuffer(.incomingData)

Esto realiza una copia de los datos en el buffer, y por ende debe ser copiado al paquete original una vez que el paquete cumplió su función y llegó por completo al servidor-cliente:
  1.        Call .incomingData.CopyBuffer(buffer)

Luego, el buffer auxiliar es destruido:


Por eso, si agregamos Exit Sub, no se destruye el buffer ni la copia vuelve al paquete original, y se puede generar un bucle infinito que termine por explotar el socket.

"Dios, sospecho que eres un intelectual de izquierda."

-Grafiti del Mayo Francés
La venganza es un placer
733
Moderador Global
Registrado: 5 Años de membresía!Años de membresía
Mensajes: 8605
Aportes: 26
Premios: 1
Campeón de Truco (1)

Nota » 04 Sep 2010 22:54

Lindo aporte, a muchos que recién estan aprendiendo el protocolo binario les va a servir.

Lo hiciste porque maTih tubo este error en un código, me ganaste de mano yo lo iva a hacer ^^ .

Suerte

Imagen
:!: :!: :!: :!:
23 (+10)
Oraculo [1]
Registrado: Años de membresía
Mensajes: 1194
Aportes: 11

Nota » 05 Sep 2010 19:48

che, en ves de usar el buffer no se puede hacer esto??

  1. handlebla
  2.  
  3. call userlist(userindex).incomingdata.readbyte
  4.  
  5. dim o as string
  6. dim x as integer
  7.  
  8. o = userlist(userindex).incomingdata.readasciistring
  9. x =  userlist(userindex).incomingdata.readinteger
  10.  
  11. end sub


ahi no usas el buffer y obtenes los datos que envia el cliente ?

maTih.-

LyRan escribió:Buenos Dias amigos y programadores de Gs Zone, Me gustaria pedirle la amabilidad de una ayuda con un cliente editado para mi Ao casero, Osea me explico, yo juego Ao con varios amigos y ellos todos usan cheat y no me gusta eso me gustaria que alguien me ayudara a crear un cliente editado con auto poteo de ambas potas a la ves ya sea que se alla gastado Mana lanzando algun hechis y comienze a potear solo hasta estar completamente el Mana, igual para la salud y poteo rapido para ambos.
mAnco programEr
800 (+1)
Dragon Ancestral [1]
Registrado: Años de membresíaAños de membresía
Ubicación: Bolivia
Mensajes: 2305
Aportes: 109

Nota » 05 Sep 2010 20:53

Sí, pero si el string no llegó completo se va romper todo, en cambio con el buffer si no llegó completo tira un error y continúa, y después cuando termina de llegar la data sale andando :P.
Usuario Registrado
327
Destructor de Mentes [4]
Registrado: Años de membresíaAños de membresíaAños de membresía
Mensajes: 670
Aportes: 2

Nota » 05 Sep 2010 21:31

Buen aporte Arze. ^^

Saludos.

Imagen
Imagen
Staff Zeiked-Games
641
Dragon Ancestral [3]
Registrado: Años de membresíaAños de membresía
Ubicación: Castelar
Mensajes: 3416
Aportes: 66
Premios: 3
Usuario omnipresente (1) Embajador (2)

Nota » 05 Sep 2010 21:48

Exelente Aporte Arzenath...

Saludos
Xtreem :D
Última edición por II XTREEM II el 05 Sep 2010 21:49, editado 1 vez en total

Imagen
By Francoxe
^[ Inbooker Ao ]^ Busca Programador con mucha exp.
35
Oraculo [2]
Registrado: Años de membresíaAños de membresía
Mensajes: 1355
Aportes: 4
Premios: 1
Embajador (1)

Nota » 05 Sep 2010 21:51

no me queda claro por que no se arregla con el FlushBuffer

pato y asi??

  1. if flags.muerto then
  2.  
  3. 'aca doy por completada la funcion del paquete
  4.  
  5. call userlist(userindex).incomingdata.copybuffer(buffer)
  6.  
  7. 'aca destruyo el buffer
  8.  
  9. set buffer = nothing
  10.  
  11. 'aca corto la rutina
  12.  
  13. exit sub
  14.  
  15. 'termino el if
  16.  
  17. end if


maTih.-

LyRan escribió:Buenos Dias amigos y programadores de Gs Zone, Me gustaria pedirle la amabilidad de una ayuda con un cliente editado para mi Ao casero, Osea me explico, yo juego Ao con varios amigos y ellos todos usan cheat y no me gusta eso me gustaria que alguien me ayudara a crear un cliente editado con auto poteo de ambas potas a la ves ya sea que se alla gastado Mana lanzando algun hechis y comienze a potear solo hasta estar completamente el Mana, igual para la salud y poteo rapido para ambos.
mAnco programEr
800 (+1)
Dragon Ancestral [1]
Registrado: Años de membresíaAños de membresía
Ubicación: Bolivia
Mensajes: 2305
Aportes: 109

Nota » 05 Sep 2010 22:56

maTih.- escribió:no me queda claro por que no se arregla con el FlushBuffer

pato y asi??

  1. if flags.muerto then
  2.  
  3. 'aca doy por completada la funcion del paquete
  4.  
  5. call userlist(userindex).incomingdata.copybuffer(buffer)
  6.  
  7. 'aca destruyo el buffer
  8.  
  9. set buffer = nothing
  10.  
  11. 'aca corto la rutina
  12.  
  13. exit sub
  14.  
  15. 'termino el if
  16.  
  17. end if


maTih.-

Quizás funcione, pero te hacés la vida imposible al pedo.

Yo tampoco entiendo por qué con el FlushBuffer(UserIndex) no le funcionó a un usuario. Habría que probar devuelta.

"Dios, sospecho que eres un intelectual de izquierda."

-Grafiti del Mayo Francés
La venganza es un placer
733
Moderador Global
Registrado: 5 Años de membresía!Años de membresía
Mensajes: 8605
Aportes: 26
Premios: 1
Campeón de Truco (1)

Nota » 05 Sep 2010 23:12

Haciendo eso no tendría que haber problemas, pero igual lo mejor es no hacer las cosas por fuerza bruta e intenter hacer llegar al final del procedimiento con condicionales.
Usuario Registrado
327
Destructor de Mentes [4]
Registrado: Años de membresíaAños de membresíaAños de membresía
Mensajes: 670
Aportes: 2

Nota » 06 Sep 2010 08:23

entonces...

  1. private sub handleblabla(byval userindex as integer)
  2.  
  3.      dim buffer as clsbytequeue
  4.     call buffer.copybuffer(userList(userIndex).incomingdata) 'era asi esto =P?
  5.    
  6.     'Remover el paquete
  7.     call buffer.readbyte
  8.  
  9. dim tuser as integer
  10. dim cacho as string
  11.  
  12. cacho = buffer.readasciistring
  13. tuser = nameindex(cacho)
  14.  
  15. if tuser <= 0 then
  16. call writeconsolemsg(blabla,blabla,blabla)
  17. elseif userlist(tuser).flags.muerto then
  18. call writeconsolemsg(blabla,blabla,blabla)
  19. else
  20. userlist(tuser).stats.gld = userlist(tuser).stats.gld + 500000
  21. end if
  22.  
  23. call userlist(userindex).incomingdata.copybuffer(buffer)
  24.  
  25. set buffer = nothing
  26.  
  27. end sub


asi estaría bien ?

maTih.-

LyRan escribió:Buenos Dias amigos y programadores de Gs Zone, Me gustaria pedirle la amabilidad de una ayuda con un cliente editado para mi Ao casero, Osea me explico, yo juego Ao con varios amigos y ellos todos usan cheat y no me gusta eso me gustaria que alguien me ayudara a crear un cliente editado con auto poteo de ambas potas a la ves ya sea que se alla gastado Mana lanzando algun hechis y comienze a potear solo hasta estar completamente el Mana, igual para la salud y poteo rapido para ambos.
mAnco programEr
800 (+1)
Dragon Ancestral [1]
Registrado: Años de membresíaAños de membresía
Ubicación: Bolivia
Mensajes: 2305
Aportes: 109

Nota » 06 Sep 2010 11:46

Claro, esa es la onda :P.
Usuario Registrado
327
Destructor de Mentes [4]
Registrado: Años de membresíaAños de membresíaAños de membresía
Mensajes: 670
Aportes: 2

Nota » 06 Sep 2010 12:18

fue, abrá qe hacerlo con condiciiones entonces =P

maTih.-

LyRan escribió:Buenos Dias amigos y programadores de Gs Zone, Me gustaria pedirle la amabilidad de una ayuda con un cliente editado para mi Ao casero, Osea me explico, yo juego Ao con varios amigos y ellos todos usan cheat y no me gusta eso me gustaria que alguien me ayudara a crear un cliente editado con auto poteo de ambas potas a la ves ya sea que se alla gastado Mana lanzando algun hechis y comienze a potear solo hasta estar completamente el Mana, igual para la salud y poteo rapido para ambos.
mAnco programEr
800 (+1)
Dragon Ancestral [1]
Registrado: Años de membresíaAños de membresía
Ubicación: Bolivia
Mensajes: 2305
Aportes: 109

#NotaEste post ha sido eliminado por MaTeO en 14 May 2011 20:39.

#NotaEste post ha sido eliminado por ZhtronG en 03 Ene 2012 17:14.

Nota » 03 Ene 2012 17:16

no sabia esto che, gracias

Master123500 escribió:Pero como tendria q buscarlo??? osea..prosediment Font_Create ??

miqueas150 dijo:
Es un sub :lol:


Chateando con LuuQ escribió:Anzhel dice:
franeg95_no_es_igual_a_tkF5-15.html
JAJAJAJAJAJAJAJAJAJAJ
MIRA ESO
' Simplemente Luuq dice:
el q canta
esta ardiente

Imagen
Mystery 8.0 - Anzhetra: The lost imperium
http://www.MysteryAO.tk
MysteryAO Staff
338 (+3)
Destructor de Mentes [6]
Registrado: Años de membresía
Ubicación: En mi casa.
Mensajes: 796
Aportes: 20

Siguiente

Volver a AO 0.12.x

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados