Hilos en SDL

Tratamos sobre el manejo de APIs frecuentemente utilizadas en el desarrollo de videojuegos, como SDL, pygame o SFML.

Hilos en SDL

Notapor lacabra25 » Jue Ago 07, 2008 1:45 am

Hola, necesito manejar hilos para una pequeña aplicacion, he pensado en usar SDL para que pueda ser portable, pero en los manuales que tengo lo unico que he encontrado es hacer que una funcion se repita cada x tiempo y yo lo que necesito es que se ejecute una sola vez, pero ademas poder usar la misma funcion en varios hilos (no me agrada la idea de copiar y pegar varias veces una misma funcion para poder usarla en diferentes hilos) y todo esto lo necesito porque estoi haciendo un juego que se pueda jugar en red (para no conectar todos los jugadores entre si todos con todos he pensado en hacer otro programa que lo ejecute solo uno y haga de servidor), y para ello estoi haciendo tambien otro programa que sera el que haga de servidor, como iniciar la escucha y la conexion con el cliente lo tengo ya manejado, la cuestion es que necesito que se puedan conectar al servidor varios jugadores a la vez, y se me ha ocurrido que una vez iniciada la escucha y tener una conexion pendiente, iniciar la conexion con el cliente en un hilo y la funcion de ese hilo se encargue de "atender a dicho jugador", mientras el hilo principal sigue a la escucha y otros hilos atienden a los otros jugadores.

Esa es una de las soluciones que se me ocurrio, otra seria que cada j¡jugador solo pueda enviar un buffer al servidor y este le responda con otro y finalize la conexion con dicho jugador para atender a los demas, pero he pensado que eso ralentizaria demasiado el funcionamiento del servidor por tener que atenderlos de uno en uno y realizando una conexion y desconexion por cada consulta de los jugadores.

Uso SDL_net.

¿Como puedo solucionar esto?, ¿sabeis de algunbuen manual sobre hilos en SDL?
Esta cuenta ahora a pasado a la cuenta jhg
Avatar de Usuario
lacabra25
 
Mensajes: 222
Registrado: Mié Abr 02, 2008 9:45 pm
Ubicación: Tenerife (España)

Notapor hugoruscitti » Jue Ago 07, 2008 8:04 pm

Cuando un programa servidor requiere atender a varios clientes al mismo
tiempo se suele usar una función llamada "select". Básicamente te permite
atender a todos los clientes en base a los eventos que se generan entre
ellos y tu programa, algo muy similar a lo que ocurre con los eventos de
ventana para un aplicación habitual de SDL.

En SDL_net no hay una función "select", pero en su lugar han incluido
"Socket Set" que cumplen la misma función, en la página de documentación
de SDL_net hay varios ejemplos de esto:

http://jcatki.no-ip.org:8080/SDL_net/SDL_net.html#SEC40

lamentablemente no tengo ejemplos (ni tiempo para hacerlos) con respeto
a este tema, pero seguramente con un poco de paciencia puedas tenerlo
funcionando.

Saludos.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor lacabra25 » Jue Ago 07, 2008 9:28 pm

Gracias por esta ayuda con los sockets y la atencion a varios clientes a la vez, voy a leer la documentacion del enlace y si consigo poner mi servidor a funcionar atendiendo a varios clientes de forma simultanea me puedo ocupar despues, una vez que sepa hacerlo bien tras probarlo haciendo mi servidor, de hacer algun ejemplo, por como dices que no tienes tiempo, mas sencillo que todo un servidor completo, algo que sea mas generico por si lo quieres meter en la seccion de ejemplos. Te avisare cuando tenga un ejemplo y ya me diras como subirlo o si te lo mando por correo.
Esta cuenta ahora a pasado a la cuenta jhg
Avatar de Usuario
lacabra25
 
Mensajes: 222
Registrado: Mié Abr 02, 2008 9:45 pm
Ubicación: Tenerife (España)

Notapor lacabra25 » Dom Ago 10, 2008 12:25 am

Hola, tengo unas pequeñas consultas para terminar el servidor de partidas en red:

- Seria posible, de algun modo, probar el servidor usando telnet o algo asi, es mas que nada para poder ir comprobando que el servidor funciona mientras voy acabandolo y mientras hago la parte cliente en el juego que se conectara al servidor, pues aun tengo que hacer la parte cliente.

- Como podria evitar que al usar printf el texto fuera al archivo que crea SDL para ello, y asi el texto se muestre en el modo texto, es porque el servidor lo estoi haciendo en modo texto ya que no necesita mostrar ninguna imagen pues solo se ocupa de atender a los jugadores que se conecten, y asi sin imagenes ocupa menos memoria, por ello para las cuatro o cinco lineas que tenga que mostrar lo veo mas comodo y mejor que lo haga con texto por consola.

- He estado mirando el enlace y lo que ha escrito hugoruscitti y tengo algunas preguntas para tenerlo todo claro, segun he estado viendo lo de el socket set solo me permite ver si hay algun socket que este generando un evento (¿con la funcion de check solo puedo ver cuantos sockets estan "generando eventos"?, pero entonces lo unico para lo que sirve es para descartar el comprobar socket por socket si esta generando eventos pues no aporta ninguna informacion mas, ¿esa funcion no hace nada mas que decir cuantos sockets estan generando eventos, para usar esa funcion no es mejor comprobar directamente socket por socket con la ready?); y con la funcion ready ¿solo se puede saber si un socket esta generando eventos, no se podria saber cual socket esta generando eventos por que se halla desconectado o por que envie datos de forma directa sin tener que comprobarlos uno a uno?

- ¿Como puedo diferenciar cuando un socket genera eventos por que envia datos, porque lee datos, o por que se halla desconectado o perdido la conexion?, ¿que el cliente este leeyendo datos genera un evento o no y simplemente se mantiene el cliente a la espera de recivir datos sin que el servidor sepa que esta esperando?, ¿la dexconesion es cuando hay un error leeyendo datos enviados por el cliente verdad?, ¿si el servidor intenta leer datos del cliente antes de que este los envie, se mantiene a la espera o da error directamente?

- Al conectar con el cliente, lo unico que se del cliente es un socket que devuelve la funcion de SDL al conectarme con el cliente, pero ¿como puedo saber la ip? la parte de a partir del numero de 32 bits sacar cada byte de la ip se como es, lo que no se es como tener ese numero de 32 bits a partir de el socket con el que el servidor se comunica con el cliente; y una ultima cosa, como puedo saber la ip del ordenador donde esta ejecutandose el servidor, porque lo intente pero claro, obtenia 0.0.0.0 y estoi segure que esa no es mi direccion ip ni en internet y en la red local, jeje, ¿podria obtener ademas de la direccion de red local (en caso que este en una red local) del ordenador donde se ejecute el servidor, la ip del ordenador visto desde internet?

- Esto es una duda que no es que necesite resolverla para terminar el servidor de partidas pero si alguien la sabe estaria bien, ¿cuando un ordenador esta en una red local, para conectar con el desde internet, se conecta solo con la direccion del router, o hay que mandarle informacion al router de la ip del area local con la que se quiere conectar?
Esta cuenta ahora a pasado a la cuenta jhg
Avatar de Usuario
lacabra25
 
Mensajes: 222
Registrado: Mié Abr 02, 2008 9:45 pm
Ubicación: Tenerife (España)


Volver a Sobre las bibliotecas multimedia

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado