Foros - Stratos

Programadores => Programación en red => Mensaje iniciado por: Milinko en 01 de Enero de 1970, 01:00:00 AM

Título: Juegos Multiplayer
Publicado por: Milinko en 01 de Enero de 1970, 01:00:00 AM
                                Me gustaria abrir un thread, aprovechando el intento del anterior, para empezar a hablar de la programación de juegos multiplayer (sobre todo comunicaciones a traves de Internet, entiendase). Tanto de aquella opción Multiplayer que todos los juegos de hoy en dia se ven "obligados" a llevar como de los juegos especificamente online (MMPOG).

Un poco ver quienes nos pegamos con esos temas y discutir acerca de las estrategias y "trucos" de programación.

Pues eso, que os animeis.

Un saludo.

Milinko                                
Título: Juegos Multiplayer
Publicado por: MChiz en 01 de Enero de 1970, 01:00:00 AM
                                Hola!
Pues precisamente yo estoy liado con WinSock :sonriendo:
Me parece muy buena idea lo de abrir un post sobre este tema, ya que casi nunca se habla.
Yo no llevo mucho tiempo con ello ( una semana ) pero ya he conseguido hacer mi primera aplicacion asíncrona ( un chat p2p ).
En fin, a ver si esto se anima :sonriendo:
Un saludo!!

< MChiz >                                
Título: Juegos Multiplayer
Publicado por: undol en 01 de Enero de 1970, 01:00:00 AM
                                Muy buenas

Esto me gusta, yo hace tiempo estuve programando con sockets en plataformas WIN32, mas tarde me pase a la programacion de sockets via linux, la verdad y creo siceramente que la implicacion de algun servidor de datos centralizado pasa por ejecutarlo bajo un GNU/Linux, las tecnicas que brinda para la programacion son increibles:
-sockets
-thread / fork
-Mutex
-Mecanismos de comunciacion IPC
-etc

Con esto no quiero decir que con una plataforma windows no se pueda implemntar dicha aplicacion , pero creo que linux nos brinda en este preciso momento una gran plataforma para crear apliaciones de este tipo

Bueno pero yo tenia otra pregunta , alguien ha programado con DirectPlay ? es o sigue siendo valido para la programacion en entornos de red?

Saludos a todos
                               
Título: Juegos Multiplayer
Publicado por: MChiz en 01 de Enero de 1970, 01:00:00 AM
                                Hola Undol:
Yo estuve intentando aprender DirectPlay hace pocos meses, y es horrible ( a mi entender ). Es un caos ( como casi todas las DirectX ).
Bueno, en realidad eso es pasable; lo que realmente no me convence es que no da soporte para el protocolo UDP. Eso es lo realmente feo que yo veo.
En fin, que prefiero WinSock ( y ademas me lo han recomendado mucha gente por encima que DirectPlay ).
Un saludo!

< MChiz >                                
Título: Juegos Multiplayer
Publicado por: Emotion en 01 de Enero de 1970, 01:00:00 AM
                                Hola,

Bueno, yo hace tiempo hice algo con Winsock, solo que a traves de un control .ocx para Visual Basic, asi que no se si servira de mucho...

La verdad es que la idea del topic me gusta mucho, a lo mejor puedo aprovechar y aprender algo nuevo :sonriendo:

Por cierto, creo (no lo confirmo ya que carezco de la informacion necesaria) que DirectPlay esta construido sobre el WinSock, con lo que seria mucho mejor (aunque algo mas complicado por las estructuras, supongo) que utilizar DirectPlay. de todas formas, creo que en FlipCode habia un buen ejemplo de como empezar con el winsock...

Por cierto... sabeis como puedo enlazar el TAPI (la API de telefonia de windows) con el WinSock?? lo digo por las conexiones de internet telefonicas... no se si deberia solamente preocuparme por el TCP/IP o si deberia abarcar el TAPI tambien

Saludos
                               
Título: Juegos Multiplayer
Publicado por: MChiz en 01 de Enero de 1970, 01:00:00 AM
                                Hola!
Yo tambien creo que DirectPlay esta basado en WinSock.
En FlipCode, GameDev, Gamasutra y todos estos sitios hay muchos tutoriales que estan muy bien! Y las MSDN tambien hacen lo suyo :sonriendo:
Sobre lo de TAPI no te puedo ayudar, porque no se ni lo que es. Te refieres a conexion directa de modem a modem? Si es eso, en mi opinion no te pongas; esta como un poco desfasado :b
Yo tenia una pregunta:
Para hacer juegos de estos masivos, como coñe se organiza? Y al hacer envios, si no tienes multicasting, que haces? Envias uno a uno?
Adios!

< MChiz >                                
Título: Juegos Multiplayer
Publicado por: undol en 01 de Enero de 1970, 01:00:00 AM
                                BUeno me gustarí empezar con un pequeño ejemplo de como realizar la parte servidor para N clientes , la estructura básica sería

Crear Socket
Binding port of socket
MIentras (true) hacer
{llamada bloqueante del accept}
fork();
{
  //codigo del hijo o sea un cliente que
    se conecta
}
finmientras

Para los apasionados al standar POSIX pueden usar el thread en vez del fork , pero bueno esto sería una manera de implementar de forma facil el bucle principal (Código para sistemas UNIX)

Si alguien quiere puedo pastear parte del código de tratamiento de winsock para VIsual c++ ( en su momento hice una especie de servidor de telnet para ordenadores windows)

Saludos
                               
Título: Juegos Multiplayer
Publicado por: MChiz en 01 de Enero de 1970, 01:00:00 AM
                                Hola Undol!
Me gustaria preguntarte una duda que tengo:
Veras, he conseguido conectar dos ordenadores mediante TCP/IP por LAN, pero no lo consigo por Internet. No deberia ser lo mismo? Al cliente no le hago el bind porque si le pongo la IP del servidor, el bind falla. Me puedes ayudar, porfavor?
Muchas gracias!!
Adios!

< MChiz >                                
Título: Juegos Multiplayer
Publicado por: karotida en 01 de Enero de 1970, 01:00:00 AM
                                Hola,

Había gente que decía que creía que DirectPlay estaba implementada sobre winsock. En el caso de TCP/IP, esto es correcto.

Tener en cuenta que DirectPlay soporta varios tipos de comunicación. En estos momentos creo que TCP/IP, IPX, Serie y módem.
Depende del protocolo elegido se implementa sobre un API u otro. TCP/IP va sobre winsock, módem sobre TAPI, etc.

Os recomiendo que entreis en esta página

http://www.hawksoft.com/hawknl/

Es el desarrollo de una libreria gratuita, con el código disponible, compatible con varios sistemas operativos. Utiliza sockets, por lo que os puede dar algunos ejemplos.                                
Título: Juegos Multiplayer
Publicado por: undol en 01 de Enero de 1970, 01:00:00 AM
                                Mchiz

La implementación entre una Lan y INternet no varia, fijate que para eso sirve TCP/IP . Un protocolo capaz de abstraer toda la complejidad del medio en un protocolo facil de programar en qualquier entorno. Por eso si utilizas una Linea Lan o una FRame Relay no tendría que darte ningun tipo de modificación en el código. Eso si no trabajas en una capa OSI inferior a la de lo sockets , que no creo !!

Por lo que veo , lo que pueda estar pasando es que el cliente esta intentod conecatar a una IP ,que igual no es la del servidor, sino la de un proxy. Esto depende mucho tambien de los firewalls que hayan entre tu cliente y el servidor, a que servicio del servidor te quieres conectar!, si se trata de algun puerto superior al 1024 ! . etc

Podrias detallar un poco mas la implementacion de la comunicación entre el cliente y el server !!

Thks
                               
Título: Juegos Multiplayer
Publicado por: ethernet en 01 de Enero de 1970, 01:00:00 AM
                                Para poder usar TCP tanto en LAN como por la conexion a internet al bindear n la struct sockaddr_in hay q poner INADDR_ANY ( lo digo de memoria ) por q si pones la IP q usas para internet o la q tienes para la LAN no funcionara para algunos de los dos casos.
Por cierto hace unos dias ha salido en gamedev.net un articulo de sockets con threads para win...
Saludos                                
Título: Juegos Multiplayer
Publicado por: MChiz en 01 de Enero de 1970, 01:00:00 AM
                                Hola!
Gracias a todos por contestar.
Ya pense eso de los firewalls, pero entonces, puedo solucionar eso desde mi programa? Pienso que deberian ser desactivados los firewalls y entonces intentar conectar, no? ( seria lo logico )
Estoy utilizando el puerto 7900.
Sobre lo de INADDR_ANY, a que te refieres? Eso se lo pongo al servidor, pero al cliente le pongo la IP del servidor. Por cierto, que al cliente no le hago ningun bind. Si lo hago, falla. Eso es correcto?
Muchas gracias a todos!

< MChiz >                                
Título: Juegos Multiplayer
Publicado por: undol en 01 de Enero de 1970, 01:00:00 AM
                                Perdona por no haber contestado antes pero estoy sin conexión a Internet desde casa

A ver vamos paso por paso:

1) El contexto INADDR_ANY se utiliza para promocionar la conexión al server desde qualquier dirección de internet, o sea ser gracias a ello le estamos diciendo que al servicio se pueden conectar desde 0.0.0.0/32 ip diferentes ( o sea todas)

2) Entiendo que la conexión que estas procurando entre el server y el cliente no deja de ser entre la misma máquina . Es eso verdad ? si es de esa manera entiendo que puede ser que te estes equivocando de direccion IP , en la maquina que tienes el server ( que supongo que es la misma que el cliente ) ejecuta el ipconfig famoso o el winipcfg para ver la ip real !!


3) No nunca debes usar el bind en la parte cliente, el bind se utiliza para enlazar un puerto determinado con el conector (socket)


4) De pasada adjunto codigo de un cliente en linux
//open socket STREAM (TCP)
  if((sfd=socket(AF_INET,SOCK_STREAM,0))==-1)
  {
      printf("Error to open socket conectionrn");
      exit(-1);
  }
  //connect to server
  if (connect_server(sfd,ser_addr,argv[1])==FALSE)
  {
     printf("Not resolv this conection with : %srn",argv[1]);
     close(sfd);
     exit(-1);
  }

//funcion connect_server
int connect_server(int f_sfd,struct sockaddr_in f_ser_addr,char *server)
{
  struct hostent * host_st; //for resolv IP

  if((host_st=gethostbyname(server))==NULL)
      return 1;

  f_ser_addr.sin_family=AF_INET;
  f_ser_addr.sin_addr.s_addr=*(long *)host_st->h_addr;
  f_ser_addr.sin_port=htons(PORT_WWW);
  printf("Conecting to : %srn",server);
  if (connect(f_sfd,&f_ser_addr,sizeof(f_ser_addr))==-1)
  {
      return 1;
  }
  return 0;
}


5) Codigo de un server en windows
result=WSAStartup(0x0101,&ws);

//.....................inicio del listen in 32333
sfd=socket(AF_INET,SOCK_STREAM,0);  //iniciamos el socket
if (sfd==INVALID_SOCKET)
    Actiu=false;

s_sock.sin_family=AF_INET;          //tipo internet
s_sock.sin_port= htons(80);      //puerto
s_sock.sin_addr.s_addr=INADDR_ANY;//cualquier dirección
if((bind(sfd,(struct sockaddr *) &s_sock,sizeof(s_sock)))==-1)
    Actiu=false;

if(listen(sfd,100)==-1) //el proceso ya puede escuchar
    Actiu=false;



                               
Título: Juegos Multiplayer
Publicado por: MChiz en 01 de Enero de 1970, 01:00:00 AM
                                Gracias por la info, pero sigue sin funcionarme cuando se trata de Internet. Seguire probando. Muchas gracias!! :sonriendo:

< MChiz >                                
Título: Juegos Multiplayer
Publicado por: AK47 en 01 de Enero de 1970, 01:00:00 AM
                                Hola a todos :sonriendo:
Undol, pero ese codigo es de TCP, no? Creo que el connect ya hace el bind por ti.
Ta pronto :ojo:                                
Título: Juegos Multiplayer
Publicado por: undol en 01 de Enero de 1970, 01:00:00 AM
                                Fijate que en los comentarios ya pone que la conexión está orientada a TCP ... por lo que refiere al bind y al connect fijate que una parte es la del server y la otra la del cliente ... pero creo que algo de razon tienes, pq :

El connect que realiza el cliente tb tiene que habrir un socket para recibir los paquetes del server, y acaba realizando un bind un poco transparente para el programador

Saludos                                
Título: Juegos Multiplayer
Publicado por: AK47 en 01 de Enero de 1970, 01:00:00 AM
                                Saludos
Jeje, tienes razon, no me habia fijado.
De cualquier modo, usar TCP para juegos de accion es un poco contraproducente, ya que puede ocasionar un retraso en la llegada de los datos enorme. Por algo Quake 2 y estos usan UDP segun me han dicho.

Aio                                
Título: Juegos Multiplayer
Publicado por: MChiz en 01 de Enero de 1970, 01:00:00 AM
                                Si que usan UDP si, pero es mas coñazo de programar :sonriendo: Aunque deberiamos hacerlo... pero no todos los juegos son de accion! :sonriendo: aaaiii, a ver si podemos innovar prontito, que los QuakAs estan muy bonitos, pero ya rallan un poco.
Adios!!

< MChiz >                                
Título: Juegos Multiplayer
Publicado por: Emotion en 01 de Enero de 1970, 01:00:00 AM
                                No obstante, parece ser que la programacion con TCP es algo peligrosa, ya que por ahi dicen que hay un tipo de ataque llamado DoS (Denial of Service) que dicen que te puede echar abajo el server, y por lo que escuche el metodo de la comunicacion por UDP era porque por lo visto no se podia duplicar un usuario y utilizaba un metodo para comprobarlo, pero es todo lo que se al respecto... alguien puede extender un poco mas esto?

Saludos
                               
Título: Juegos Multiplayer
Publicado por: Psyc0 en 01 de Enero de 1970, 01:00:00 AM
                                Hola, estoy programando una aplicación en Visual Basic, y usando el control winsock para hacer un chat p2p.

La idea ke tengo es guardar mi ip en una base de datos que esté en un servidor de internet y así poder acceder desde otro ordenador con el otro cliente y saber a que ip conectarme, osea que seria una aplicación cliente/servidor.

Pero no se como modificar la base de datos de internet, en lan o en local sí puedo con ADO por código por ejemplo.

Si alguien me hecha una mano estaré muy agradecido. Gracias.                                
Título: Juegos Multiplayer
Publicado por: undol en 01 de Enero de 1970, 01:00:00 AM
                                Vale vale TCP tendrá sus "defectillos" pero lo que esta claro es que alguno de ellos son totalmente superables con una buena programación, supongo que ha nadie se le ocurriria llamar a una llamada bloquente en el thread principal, pues eso es lo mismo .. los recv and send son bloqueantes hasta que el recptor no se da por enterado, pero superar esa trivialidad es tan facil como implementar todo el tema de red en un nuevo thread con los "TIME" correspondientes

Saludos
                               
Título: Juegos Multiplayer
Publicado por: Milinko en 01 de Enero de 1970, 01:00:00 AM
                                [Respondiendo a Emotion]

Realmente, las opciones de utilizar TCP o UDP no vienen tanto por los ataques que puedas recibir sino por las necesidades de comunicación en cada caso.

Caracteristicas de TCP

- Es un protocolo orientado a conexión
- La entrega de datos (paquetes) es fiable y ordenada.
- Segmentación. Optimiza el tamaño de los paquetes para el envío.
- Tiene control de flujo y de congestión. Es decir, se "autolimita" en caso de alto tráfico en alguna zona.

Caracteristicas UDP

- No es orientado a conexión.
- No se garantiza ni el orden ni la entrega del envío.
- Tiene prioridad sobre TCP.

Por ejemplo, el protocolo HTTP (el que utilizamos tú y yo para escribir en estos foros) está construido sobre TCP. En el caso de los MMORPG, los protocolos de dichos juegos suelen estar construidos sobre UDP ya que:

- Es bastante más rapido que TCP por las carácteristicas mencionadas anteriormente.
- Aunque no está garantizado ni el orden ni la entrega se puede programar una capa para ello y, en cualquier caso, hay eventos dentro del juego que puedes permitirte el "lujo" de no entregarlos (como movimientos de personajes, por ej.).

En cuanto al tema de los ataques, es cierto que pueden existir, pero tambien existen forma de defenderte contra ellos. De hecho, aunque utilices UDP tambien puedes ser víctima de ataques a tu servidor.

Y bueno, ya está que me he enrollado mucho.

Un saludo
Milinko.
                               
Título: Juegos Multiplayer
Publicado por: Milinko en 01 de Enero de 1970, 01:00:00 AM
                                Undol,

tambien se puede programar sockets TCP "no bloqueantes". En cualquier caso es buena idea utilizar un thread independiente para las operaciones de E/S de sockets.

Un saludo.

Milinko.                                
Título: Juegos Multiplayer
Publicado por: Emotion en 01 de Enero de 1970, 01:00:00 AM
                                De todas formas, creo que habia en los textos del GDC de este año uno especifico sobre como evitar ataques a servidores con TCP (o al menos hablaba sobre como evitar ciertos ataques). No lo confirmo ya que no lo he leido del todo, pero algo si que viene
                               
Título: Juegos Multiplayer
Publicado por: Milinko en 01 de Enero de 1970, 01:00:00 AM
                                Eso está disponible en algún sitio, Emotion??

Gracias.

Milinko                                
Título: Juegos Multiplayer
Publicado por: Emotion en 01 de Enero de 1970, 01:00:00 AM
                                Pues si, es el enlace a los textos del GDC 2002, es decir, el de este año.

De hecho, salio en la misma pagina de Stratos, en la cual he buscado la referencia de la que te hablo, que esta aqui:

http://www.gdconf.com/archives/proceedings.../2002/index.htm

De hecho, el texto exacto es este (menciono el titulo y las pulsaciones de raton las dejo para ti :sonriendo:)

"Defense Against Service Theft, Internet Cheating
and Denial of Service"


[ Este Mensaje fue editado por: Emotion el 2002-05-03 18:27 ]