Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: Phoenix on January 18, 2010, 06:52:18 PM

Title: Problema con aplicacion Cliente-Servidor
Post by: Phoenix on January 18, 2010, 06:52:18 PM
Buenas!

Estoy probando la biblioteca fsock para la realizacion de una autenticacion de los clientes dentro de la base de datos de un servidor.

El codigo que tengo es el siguiente:

[code language="bennu"]

Servidor

 Main Process...

 fsock_init(64); //Iniciamos fsock
 socket_listen=tcpsock_open();
 fsock_bind(socket_listen,1322);
 tcpsock_listen(socket_listen,60);

 fsock_fdzero(0); //Socketset 0 para la conexion al servidor
 fsock_fdset(0,socket_listen);

 //Esperamos conexiones
 Repeat
   if (fsock_select(0,-1,-1,0)>0) //Si hay actividad en el socketset
      say("conexion recibida");
      sock_cliente=tcpsock_accept(socket_listen,&ipaddr,&portaddr);
      if((sock_cliente!=-1)) //Si recibimos una conexion de entrada de usuario
          //Ejecuto el proceso que respondera a este cliente
            n_conectados++;
            Client_Login(sock_cliente,n_conectados);
       end
    end
    fsock_fdset (0, socket_listen); //hay que reincluir tras uso de select
    frame;
 until(key(_esc));

 Process Login(sock_cliente,Mysocketset)
       
       tcpsock_recv(sock_cliente,&Nombre,sizeof(Nombre));

       //... Compruebo que el nombre esta en la base de datos y le contesto
       Login_ok=Login_BuscaBD(Nombre);

   //... Mando respuesta de si el login es correcto.. es decir si el nombre esta en la BD
   tcpsock_send(sock_cliente,&Login_ok,sizeof(Login_ok));

   if(login_ok==1) //Correcto

     //... Este proceso esperara a otras peticiones de este cliente
          fsock_socketset_free(Mysocketset);
          fsock_socketset_add(Mysocketset,sock_cliente );

          loop
           if((fsock_select(Mysocketset,-1,-1,0)>0) && fsock_fdisset(Mysocketset,sock_cliente))
                tcpsock_recv(sock_cliente,&accion,sizeof(accion));
                if(accion==1)
                  say("Hola usuario!! Elegiste la opcion 1");
                  accion=0;
                end
                if(accion==2) // desconexion
                   say("Jugador desconectado");
                   accion=0;
                   break;
                end
             fsock_fdset(Mysocketset,sock_cliente);
           end
           frame;
          end
        end
    if(login_ok==2) //Incorrecto
              //Cierro conexion con el usuario
        end
 end

[/code]

[code language="bennu"]

Cliente

  Main Process

  fsock_socketset_free(0);
  fsock_socketset_add(0,socket_conex);

  if((tcpsock_connect(socket_conex,"xxx.xxx.xxx.xxx",1322))==0) //xxx... Ip Servidor xD
       //Mando nombre
       tcpsock_send(socket_conex,&Nombre,sizeof(Nombre));
       //Espero confirmacion de que mi login fue correcto
   tcpsock_recv(sock_cliente,&login_ok,sizeof(login_ok));
   if(login_ok==1)
          say("Identificacion correcta");
          Repeat
              if(key(_enter))
                 say("Mandando saludo");
             accion=1;
                 tcpsock_send(socket_conex,&accion,sizeof(accion));
          end
          until(key(_esc))
          //Cerrar conexion
       end
   if(Login_ok==2)
      say("error conexion, login failed");
   end
   end

[/code]

Despues de esto... xD, el server me responde correctamente dependiendo de si el nombre esta dentro de una base de datos que contiene el servidor... El problema viene.. en que... la parte de codigo del proceso "Login" del servidor, que espera a que un usuario ya conectado le mande nuevas peticiones, no parece responderlas con lo que tanto server como cliente se quedan bloqueados. Alguien sabe si estoy haciendo mal la espera de peticiones de los clientes logeados en el servidor? o como habria que hacerlo?

Muchas gracias.
Title: Re: Problema con aplicacion Cliente-Servidor
Post by: Windgate on January 18, 2010, 09:28:37 PM
Ojo con los FRAME, ten en cuenta que si un bucle no hace FRAME bloquea, también ten en cuenta que el FPS puede variar del cliente al servidor y no es bueno asumir que por cada iteración del cliente el servidor hace otra... Tuve varios problemas así con la network de Sandman y por ahora he paralizado mi "investigación", te sigo el corriente a ver si consigues algo más palpable que lo que yo conseguí...
Title: Re: Problema con aplicacion Cliente-Servidor
Post by: Phoenix on January 18, 2010, 11:57:26 PM
El servidor se comporta perfectamente al aceptar nuevas conexiones y
en cada una de ellas realiza la comprobacion de si ese nombre de
usuario pertenece a la base de datos.

Pff no se tio, el unico gran problema esta en poder responder a un cliente
ya logueado. estoy 100% seguro que el problema viene a que no estoy
usando bien lo de los socketsets y que ademas no uso las funciones correctamente
para saber cuando se hace una accion desde el cliente.

[code language="bennu"]
if((fsock_select(Mysocketset,-1,-1,0)>0) && fsock_fdisset(Mysocketset,sock_cliente))[/code]

A esta parte me refiero xD, mañana lo mirare haber si saco algo con la mente
algo mas freskita.
Title: Re: Problema con aplicacion Cliente-Servidor
Post by: Windgate on January 19, 2010, 12:12:45 AM
Yo usé la otra librería que es de más alto nivel, tendría que mirar lo que hacían esas funciones de la fsock porque las probé hace muchísimo y ni me acuerdo ya, por ahora no puedo decirte mucho... Sólo que el tema de conexiones de red es una cuenta pendiente para muchos de nosotros y haría falta algún ejemplo/plantilla. Por ahí circulaba uno de chat (Para mi librería) y me sirvió de algo, pero no tenía nada que ver con lo que yo prentedía, que era un juego, y ahí me encontré glitches y problemas para que server y cliente vayan al mismo fps y/o al menos puedan bloquearse hasta recibir respuesta :P

Mañana ambos más frescos seguimos con el asunto, ok!
Title: Re: Problema con aplicacion Cliente-Servidor
Post by: SplinterGU on January 19, 2010, 12:20:20 AM
yo estoy seguro que hay ejemplos funcionales en el foro
Title: Re: Problema con aplicacion Cliente-Servidor
Post by: Phoenix on January 19, 2010, 11:19:38 AM
Bueno posteo el codigo completo de la aplicacion... he logrado que si solo conecto un cliente, podemos comunicarnos con el servidor una vez conectados a el, incluso si el cliente se desconecta manda un mensaje de desconexion para que el server cierre ese proceso con el cliente. Ahora... todo va mal cuando conecto 2 clientes al servidor y mando un mensaje de saludo al server con cualquiera de los 2 clientes... se queda bloqueado tanto cliente como servidor. Sigo pensando lo mismo de los socketsets.

En el codigo empleo una variable "ok" para sincronizar el servidor con el cliente, cuando se vayan a mandar datos de uno a otro. El cliente al conectarse manda un array de chars(Nombre de usuario) y el server le respondera consultando en la BD si fue correcto.

Por otra parte no encontre ningun ejemplo que funcione con el fsock y ademas emplee sockets/TCP para las conexiones.

Uso Bennu 0.93, que es la unica que encontre en la que funcionaran los modulos sqlite3 y fsock a la vez xD, que lo incluyo en el rar para no tener que buscarlo.

Enlace:

http://www.mediafire.com/?eyiywyncdei (http://www.mediafire.com/?eyiywyncdei)

Title: Re: Problema con aplicacion Cliente-Servidor
Post by: Windgate on January 19, 2010, 11:28:35 AM
Descargando.

Sí que hay ejemplos por ahí, pero yo buscaba algo muy sencillo, como por ejemplo el típico pong con los 2 palitos y la bolita para hacer un juego para 2 jugadores, algo con el mínimo número de líneas y comentado, ya sé que es mucho pedir :D Para la librería de Sandman estaba el chat, pero me pareció demasiado complicado y alejado de lo que buscaba, así que tiré directamente de la documentación, que también tiene algún breve ejemplo de uso y me sirvió para empezar.

Yo comencé con un juego sencillito, pero aparecieron algunos glitches con la librería de Sandman y paralicé el proyecto, algún día que lo desempolve y lo deje un poco estable lo subo como recurso, conseguí 2 jugadores en PCs diferentes moviéndose en pantalla sin problemas, pero con el tercer cliente y siguientes comenzaron los problemas de glitches, bloqueos, paquetes perdidos... Quizás un mal protocolo, quizás un mal programador... También detectamos algún pequeño bug en la librería y aunque se arregló alguna cosa también quedaron ideas pendientes de incluir.
Title: Re: Problema con aplicacion Cliente-Servidor
Post by: Drumpi on January 19, 2010, 02:20:08 PM
Una preguntita ¿la espera de respuesta es una función bloqueante? es decir, ¿se queda ahi hasta que obtiene algún tipo de respuesta?
Title: Re: Problema con aplicacion Cliente-Servidor
Post by: Phoenix on January 19, 2010, 02:27:32 PM
Quote from: Drumpi on January 19, 2010, 02:20:08 PM
Una preguntita ¿la espera de respuesta es una función bloqueante? es decir, ¿se queda ahi hasta que obtiene algún tipo de respuesta?

Yo lo tengo configurado como bloqueante, pero puedes definir el socket como no bloqueante si es necesario.

[code language="bennu"]int fsock_setblock(int socket, int nobloqueante);
Ej.- fsock_setblock(socket_listen,1);[/code]

Title: Re: Problema con aplicacion Cliente-Servidor
Post by: l1nk3rn3l on January 19, 2010, 09:12:59 PM
en el bennupack hay un monton de ejemplos para red
ve al paquete de DLLs..

;D
Title: Re: Problema con aplicacion Cliente-Servidor
Post by: Windgate on January 19, 2010, 10:20:36 PM
k++ l1nk, tengo por ahí los paquetes de ejemplos pero francamente nunca he husmeado a fondo el de dlls fíjate tú...

Por cierto, te lo he dicho decenas de veces, ¿Por qué no metiste la dll de Bennu3D en el Bennupack 1.8?, lo he instalado en decenas de lugares y siempre tengo que meterlo a mano :( tenlo en cuenta para la 1.9 xfa xfa xfa xD

Bien, y sobre los sockets, si manejas todos los clientes en local... No me queda muy claro si serán capaces o no de diferenciar a quién de los clientes va dirigido cada paquete del server... No soy ningún experto en sockets que conste :P
Title: Re: Problema con aplicacion Cliente-Servidor
Post by: Phoenix on January 20, 2010, 11:06:29 AM
Quote from: l1nk3rn3l on January 19, 2010, 09:12:59 PM
en el bennupack hay un monton de ejemplos para red
ve al paquete de DLLs..

;D

Ok gracias! ahora le echare un vistazo.

Estoy probando usando conexiones udp, parace que la cosa es algo mas estable, al menos, eso me parece por ahora xD.

@Windgate, luego probare a ejecutar 2 clientes en maquinas con distinta ip y ver que pasa.
Title: Re: Problema con aplicacion Cliente-Servidor
Post by: SplinterGU on January 20, 2010, 04:32:47 PM
junto con la ultima version compile la fsock... esta en el directorio contrib... el binario facilmente identificable...
Title: Re: Problema con aplicacion Cliente-Servidor
Post by: Phoenix on January 20, 2010, 08:05:09 PM
Quote from: SplinterGU on January 20, 2010, 04:32:47 PM
junto con la ultima version compile la fsock... esta en el directorio contrib... el binario facilmente identificable...

Mola, muchas gracias!

Ahora mismo cambie a usar la libnetwork.dll de Sandman, de momento.. funciona perfecto.. atiende la conexion de nuevos clientes y ademas contesta las distintas acciones de los clientes ya conectados. Luego seguire, a ver si todo va tan bien como hasta ahora xD.

Title: Re: Problema con aplicacion Cliente-Servidor
Post by: Windgate on January 20, 2010, 11:18:30 PM
¿Todo bien con la librería de Sandman? Interesante, quizás vaya siendo hora de desenterrar mi proyecto y enseñaros los problemas que tenía, como os digo al final me quedé sin saber si el error se debía al protocolo que estaba usando... Por supuesto eran muy pocas líneas de código, soy un trolazo y siempre intento tener procesos/funciones que caben en pantalla :P
Title: Re: Problema con aplicacion Cliente-Servidor
Post by: Phoenix on January 21, 2010, 09:21:51 AM
Quote from: Windgate on January 20, 2010, 11:18:30 PM
¿Todo bien con la librería de Sandman? Interesante, quizás vaya siendo hora de desenterrar mi proyecto y enseñaros los problemas que tenía, como os digo al final me quedé sin saber si el error se debía al protocolo que estaba usando... Por supuesto eran muy pocas líneas de código, soy un trolazo y siempre intento tener procesos/funciones que caben en pantalla :P

De momento si va bien. El programa que tengo entre manos es algo sencillo, los usuarios acceden al servidor con su clave y contraseña y una vez conectados pueden pedir distinta informacion dentro de la base de datos del servidor o añadir nuevos registros tales como mensajes a otros usuarios, etc... Añadi 2-3 acciones con el server y responde bien... lo unico que no me pasaba con fsock, es que el cliente cuando manda la info de la accion que quiere hacer, tiene que esperar en un bucle hasta que el servidor atiende su peticion( con fsock era bastante mas rapido, pero no funcionaba con mas de un cliente conectado).

Si necesitas que le eche un vistazo a lo que llevas hecho en el proyecto de red, ponlo por aqui y mirare a ver si te puedo ayudar en algo(aunque no lo se, tampoco es que sea un mega-experto en estas cosas xD).

Title: Re: Problema con aplicacion Cliente-Servidor
Post by: Phoenix on January 23, 2010, 07:44:37 PM
Pues finalmente decidido totalmente por hacer la aplicacion con la libreria de Sandman.

Subo un sencillo ejemplo de conexiones entre el servidor y los clientes. El cliente manda un nombre de usuario y password y el servidor le responde si esta dentro de la base de datos. Una vez conectado el cliente podra saludar al servidor.

Para que funcione, no olvidar abrir el puerto 1322 en la maquina que ejecute el servidor.

Link:

http://www.mediafire.com/?ytmtyynmz5z (http://www.mediafire.com/?ytmtyynmz5z)



Title: Re: Problema con aplicacion Cliente-Servidor
Post by: Windgate on January 23, 2010, 08:59:59 PM
Probado y funciona perfecto, me ha soportado 3 clientes xD

Veo que la idea de la aplicación es sencilla, ¿Te has planteado hacer algún tipo de sincronización gráfica?, ese es el problema que no conseguí resolver en su momento, que los clientes tengan un gráfico y puedan moverse y verse correctamente...

Seguiré el hilo, si te planteas hacer algo así cuenta conmigo.
Title: Re: Problema con aplicacion Cliente-Servidor
Post by: Phoenix on January 25, 2010, 12:58:47 PM
Quote from: Windgate on January 23, 2010, 08:59:59 PM
Probado y funciona perfecto, me ha soportado 3 clientes xD

Veo que la idea de la aplicación es sencilla, ¿Te has planteado hacer algún tipo de sincronización gráfica?, ese es el problema que no conseguí resolver en su momento, que los clientes tengan un gráfico y puedan moverse y verse correctamente...

Seguiré el hilo, si te planteas hacer algo así cuenta conmigo.

Pues estoy con ello. Empece a programar el clasico "Pong" online. El juego tiene un servidor que espera que se conecten 2 jugadores, una vez conectados, inicia los 2 procesos que van a controlar la comunicacion entre el servidor y los 2 jugadores, con lo que toda la informacion que manden los jugadores pasaran por el server y el server se encarga de mandar a los jugadores. Los movimientos de las 2 raquetas estan bastante bien sincronizadas, el problema viene con la pelotita... no se si sera por el tema de los angulos(que se me dan fatal) pero no consigo que reboten cuando tienen que hacerlo xD.

Lo subo por aqui y le echas un vistazo.

Recuerda que tienes que ejecutar 1 servidor y conectar los 2 clientes, luego espera 1 segundo(o poco mas) y se inicia el juego sincronizado.

Link : http://www.mediafire.com/?oy5ni2xjhz4

Title: Re: Problema con aplicacion Cliente-Servidor
Post by: Windgate on January 25, 2010, 09:22:14 PM
Descargando y probando, te contaré, la sincronización es peluda... Quizás te quieras pasar por el hilo (En inglés) del módulo, en él estuve hablando con Sandman, aunque lo dejamos parando hace unas semanas, algo podrías aportar seguro.
Title: Re: Problema con aplicacion Cliente-Servidor
Post by: Phoenix on January 26, 2010, 07:03:01 PM
Quote from: Windgate on January 25, 2010, 09:22:14 PM
Descargando y probando, te contaré, la sincronización es peluda... Quizás te quieras pasar por el hilo (En inglés) del módulo, en él estuve hablando con Sandman, aunque lo dejamos parando hace unas semanas, algo podrías aportar seguro.

Ok! ya arregle el problema de los de los angulos.. de momento solo van en linea recta pero bueno... mañana mirare a ver como arreglar el asunto. Tuve que cambiar unas cuantas cosas y compartir alguna informacion mas sobre la posicion de la bola para que no se des-sincronize demasiado cuando se mueve.
Title: Re: Problema con aplicacion Cliente-Servidor
Post by: Windgate on January 26, 2010, 07:51:29 PM
Harías un gran favor si vas subiendo versiones, más que nada por ir viendo el proceso de desarrollo y no encotrarnos con grandes cambios, que eso luego tira para atrás y da asco tener que mirarse todo el código de golpe :P
Title: Re: Problema con aplicacion Cliente-Servidor
Post by: Phoenix on January 26, 2010, 08:02:58 PM
Ok, aki la tienes: http://www.mediafire.com/?mulnmtaqmmm (http://www.mediafire.com/?mulnmtaqmmm)

Cambie el tamaño de la pelotita por que la otra era... pff xD
Title: Re: Problema con aplicacion Cliente-Servidor
Post by: Phoenix on January 27, 2010, 12:36:39 PM
Ultima version http://www.mediafire.com/?hmk3yzmyttw (http://www.mediafire.com/?hmk3yzmyttw)

+ Angulos corregidos (queda por retocarlos... pero mi geometria no da para mucho mas).
+ Añadido Game loop en el cliente y el servidor para que no se termine la partida cuando se hace un punto.

- De vez en cuando se quedan bloqueados, esperando el reinicio del partido cuando se hace algun punto.

Title: Re: Problema con aplicacion Cliente-Servidor
Post by: l1nk3rn3l on January 27, 2010, 02:45:35 PM
robando...  digo descargando..   ;D
Title: Re: Problema con aplicacion Cliente-Servidor
Post by: Windgate on February 07, 2010, 04:30:46 PM
Bien, siento no haberme metido en este hilo todo lo que me hubiese gustado... Voy a "intentar" hacer uso de tu proyecto como plantilla de partida para un proyecto en 3D lo más sencillo posible, como tu juego del palito y la bolita pero en 3D y sin bolita, para que me entiendas xD

A ver si puedo subir algo digno durante esta tarde...

EDIT: No encuentro los archivos en MediaFire... ¿Te los han borrado o has sido tú?, no tengas miedo de guardar antiguas versiones, es buen hosting gratuito, en 2 años de uso nunca he perdido nada :P y bueno, sube la última versión cuando tengas un tiempo :D
Title: Re: Problema con aplicacion Cliente-Servidor
Post by: Phoenix on February 08, 2010, 09:29:07 AM
Mmm! yo no borre nada de las versiones que subi  :-[

Te subo la ultima que hice... No me acuerdo de como lo quede por que hace una semanita que no lo toco, pero siempre hay algun problema con los frames, hay un cliente(el primero que se conecta) que va minimamente algo mas adelantado que el otro, con lo que si tuvieramos 20 clientes conectados probablemente seria una locura, ya que el cliente que se conecto primero recibiria la informacion mucho antes que el que se conecto el ultimo.

link: http://www.mediafire.com/?zy2ok5zzgmn (http://www.mediafire.com/?zy2ok5zzgmn)