Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Programa que recopile datos del servidor de un juego

Estas en el tema de Programa que recopile datos del servidor de un juego en el foro de C/C++ en Foros del Web. Hola a todos!! Estaba planteándome sobre como hacer un programa que recopile información del servidor de un juego, es decir, pongamos el caso del Counter ...
  #1 (permalink)  
Antiguo 25/01/2014, 08:47
 
Fecha de Ingreso: mayo-2011
Mensajes: 65
Antigüedad: 13 años
Puntos: 3
Programa que recopile datos del servidor de un juego

Hola a todos!!

Estaba planteándome sobre como hacer un programa que recopile información del servidor de un juego, es decir, pongamos el caso del Counter Strike, que tiene un servidor con IP xxx.xx.xx.xx y que funciona por el puerto xxxxx, utilizando eso, podría hacer un programa que contacte con esa IP y me devuelva, por ejemplo, el mapa que están jugando en ese servidor, el número de jugadores que están conectados y el nombre de cada uno, por ejemplo?

Sería algo muy complicado de hacer? Es que no he trabajado nunca con un tema parecido. Me explico, sería algo así como conectar y hacer una escucha de tal IP y puerto y esto me devolvería quizá una matriz de datos o un string con toda la información? No creo que sea tan fácil no?


Gracias, un saludo!
  #2 (permalink)  
Antiguo 25/01/2014, 09:11
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Programa que recopile datos del servidor de un juego

"...No creo que sea tan fácil no?..."

Mas bien no :)

Normalmente cuando conectas a un servidor lo que quieres es acceder a un recurso (p.ej. una imagen), o ejecutar una accion (consultar una base de datos), o subir un recurso (un documento). Hay varias formas de hacer cada cosa, y cada forma se rige por un protocolo; este protocolo describe no solo la forma como tienes que pedir al servidor el acceso al recurso sino tambien como el servidor te retorna el resultado de la peticion.

A parte de eso esta la validacion de usuario: el serividor te limita el acceso, o el propio recurso al que acedes te limita el recurso. Pon el caso de ftp: el servidor ftp te pide que te indentifiques, si no lo haces no te dejara ver nada (como mucho solo la zona publica), esto lo hace el propio servidor. O pon el caso de un recurso web: si conectas a un php de un servidor de correo solicitando la lista de correos de otra persona, el propio recurso te pedirá que te identifiques.

Dicho de otra forma: si sabes como funciona el servidor de Counter Strike puedes solicitarle informacion y recibirla correctamente siempre que cumplas sus reglas (las que sean).

Te propongo que comiences con la guia beej sobre trabajo en red, es muy completa y veras ejemplos practicos. Luego puedes buscar mas informacion sobre el protocolo http e intentar descargar una web o una imagen de una web; tambien puedes buscar algo acerca de ftp y implementar tu propio cliente ftp.


"...sería algo así como conectar y hacer una escucha de tal IP y puerto..."

Si que existen herramientas para tal objetivo que puedes llamarlas herramientas de monitorizacion de la red, y como puedes imaginar tambien sirven para otros propositos.

No se si te habrá sido de ayuda todo esto.

Saludos
vosk
  #3 (permalink)  
Antiguo 25/01/2014, 09:25
 
Fecha de Ingreso: mayo-2011
Mensajes: 65
Antigüedad: 13 años
Puntos: 3
Respuesta: Programa que recopile datos del servidor de un juego

Sí, me ha servido! Muchas gracias!!

Me leeré todas esas guias y veré a ver que puedo hacer, sobre el juego no es el Counter Strike, es el Multi Theft Auto: San Andreas, lo que pasa es que quizá con el ejemplo del CS lo entendíais mejor, ya que es un juego bastante más conocido.

Lo preguntaba porque quizá, como al buscar en la lista de servidores, solamente con buscarlo en la barra te aparece esta info:

http://i39.tinypic.com/11aeru1.jpg

Del mismo modo que tú al entrar en el exe podías ver esa información públicamente, no sé si de algún modo se podía automatizar para que eso un programa lo hiciera cada cinco segundos por ejemplo, y que te guardara los resultados en un .txt

Muchas gracias por la respuesta vosk, un saludo.
  #4 (permalink)  
Antiguo 25/01/2014, 16:45
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 13 años, 9 meses
Puntos: 13
Respuesta: Programa que recopile datos del servidor de un juego

Te dejaré algo que te ayudará para trabajar con servidores source y goldsource, ambos de valve.

https://developer.valvesoftware.com/wiki/Server_queries

Para poder trabajar con él, primero tienes que leer la guía que te mencionó vosk, para comprender como funcionas las redes, como tratarlas y demás. Luego en la guía te servirá para trabajar con éste tipo de servidores, CS, HL, CS:S y demás. Es una referencia.

Recuerda que no todos los juegos envían esa información de la misma forma. Por ejemplo, esta guía de arriba no te servirá para otros servidores como COD o demás, trabajan de forma diferente y ya queda de tu parte aplicar ingeniera inversa con un monitor de red, como wireshark o buscar guías en internet, es más posibles que siempre encuentres estas guías o pedazos de códigos en PHP, si comprendes el lenguaje, lo podrás pasar fácil a C.

Desde mi punto de vista, para hacer estas cosas, es necesario que comprendas un poco de un monitor de red, de un debugger como gdb, o también de una función que te devuelva todo en HEX, porque la mayoría de los datos que te devolverá no podrás imprimirlo con un simple printf.

Por ejemplo, los datos que te devolverá será algo así (usando en un ejemplo real mío):

Código TEXT:
Ver original
  1. (gdb) b 72
  2. Breakpoint 1 at 0x8048747: file test2.c, line 72.
  3. (gdb) run
  4. Starting program: /home/guzzano/test
  5. bytes: 101; data: ����m127.0.0.1:27017
  6.  
  7. Breakpoint 1, main (argc=1, argv=0xbffff3d4) at test2.c:73
  8. warning: Source file is more recent than executable.
  9. 73     
  10. Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.132.el6.i686
  11. (gdb) p buf
  12. $1 = "\377\377\377\377m127.0.0.1:27017\000Galaxy Network Cs 1.6\000de_dust2_2006\000cstrike\000LtNGaming.com\000  /dw\000\001\000\000\000\001\000\000\000\000\000\000\000\001\000\001\000\360\377\277\024\356\377\277#\360\377\277\214\202\004\b\000\000\000\000\n\000\000\000\000\000\000\000\000\000\000\001\001\000\000\000\000\260+\000\370\270+\000\000\002\000\000\177ELF\001\001\001\003\000\000\000\000\000\000\000\000\003\000\003\000\001\000\000\000\200N-\000\064\000\000\000t\033\035\000\000\000\000\000\064\000 \000\n\000(\000K\000J\000\006\000\000\000\064\000\000\000\064\340+\000\064\340+\000@\001\000\000@"...
  13. (gdb) continue
  14. Continuing.
  15. bytes: 685; data: ����D
  16.  
  17. Breakpoint 1, main (argc=1, argv=0xbffff3d4) at test2.c:73
  18. 73     
  19. (gdb) p buf
  20. $2 = "\377\377\377\377D\035\000-Death me! Synfield:)\000\000\000\000\000\220\242\017D\000tomoki-kun\000\000\000\000\000\200\201zB\000THE GHOST\000\000\000\000\000,H\311D\000Gold\000\000\000\000\000\200\230{B\000[C]arita[P]ro\000\000\000\000\000\000]\305A\000DerLakK\000\001\000\000\000\000\035,B\000*_*CHEO*_*\000\000\000\000\000\000\233\031B\000Maikol\000\000\000\000\000\000\304dB\000Arixon*-*\000\000\000\000\000\260\337AE\000ChAN3L | Arr3ChA la mariCA\000\000\000\000\000"...
  21. (gdb) continue
  22. Continuing.
  23. bytes: 90; data: ����I0Galaxy Network Cs 1.6
  24.  
  25. Breakpoint 1, main (argc=1, argv=0xbffff3d4) at test2.c:73
  26. 73     
  27. (gdb) p buf
  28. $3 = "\377\377\377\377I0Galaxy Network Cs 1.6\000de_dust2_2006\000cstrike\000LtNGaming.com\000\n\000  \000dw\000\001\061.1.2.6/Stdio\000\200\211i\000[C]arita[P]ro\000\000\000\000\000\000]\305A\000DerLakK\000\001\000\000\000\000\035,B\000*_*CHEO*_*\000\000\000\000\000\000\233\031B\000Maikol\000\000\000\000\000\000\304dB\000Arixon*-*\000\000\000\000\000\260\337AE\000ChAN3L | Arr3ChA la mariC"...

Solo queda que tú apliques técnicas para parsear estos datos a una estructura y listo.

Un saludo.

Etiquetas: funcion, juego, programa, servidor, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:15.