Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Juegos Multiplayer

Iniciado por Milinko, 01 de Enero de 1970, 01:00:00 AM

« anterior - próximo »

Milinko

                                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                                
-------------------------------------------
Milinko
"The Loneliness Of The Long Distance Runner"
--------------------------------------------

MChiz

                                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 >                                

undol

                                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
                               
aludos --{Undol}--

MChiz

                                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 >                                

Emotion

                                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
                               
G3: Get the Power!

MChiz

                                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 >                                

undol

                                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
                               
aludos --{Undol}--

MChiz

                                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 >                                

karotida

                                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.                                

undol

                                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
                               
aludos --{Undol}--

ethernet

                                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                                

MChiz

                                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 >                                

undol

                                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;



                               
aludos --{Undol}--

MChiz

                                Gracias por la info, pero sigue sin funcionarme cuando se trata de Internet. Seguire probando. Muchas gracias!! :sonriendo:

< MChiz >                                

AK47

                                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:                                






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.