martes, enero 16, 2007

Sockets

El viernes pasado, mi "jefe" (ojala todos los jefes fuesen asi) nos planteaba a mi y al otro profesor de practicas una duda que le habia surgido a raiz de la practica 1 de Sistemas operativos de este año. La duda era si una vez te conectas a traves de socket a un servidor habria que hacer alguna gestion de puertos o si no habria ningun problema en ello. Pero primero habria que explicar un poco de que va la practica.

La parte practica de la asignatura se divide en 3 practicas: Inferno, Purgatorio y Paradiso. En la primera de ellas, que es en la que se trabaja con sockets, hay que diseñar una arquitectura cliente-servidor en la que n clientes (10 por limitaciones a los usuarios para que nadie pueda crear un numero indefinido de hijos y saturar el sistema) se conectan a un servidor que les permite interactuar con otros clientes. Disponemos de un puerto predefinido que el servidor "abrira" y utilizara para "escuchar" peticiones de conexion.
La conexion se produce a traves de un socket. Para quien no sepa que es un socket, esto es un vinculo entre una IP + puerto y otra IP + puerto a traves de una red, y utilizando un protocolo determinado.

La duda era: Si solo utilizamos un puerto en el servidor, que sucedera cuando se conecten los diferentes clientes? No se producira una colision? Al crear el socket, no se establecera la comunicacion y sera imposible que mas clientes puedan comunicarse utilizando el mismo puerto en el servidor? Es decir, si el servidor tiene la IP x.x.x.x y abrimos el puerto 666, y el cliente tiene la IP y.y.y.y e intenta abrir una conexion, el socket no sera (x.x.x.x + 666 , y.y.y.y + puerto_cliente) ?
Esta es una duda tipica que surge al diseñar y programar esta practica.

Evidentemente no es esto lo que pasa, ya que si asi fuese seria imposible hacer que un servidor aceptase mas de una peticion y solo podriamos diseñar modelos de igual a igual (p2p). Entonces, que sucede realmente en el servidor? Miremos el siguiente codigo:


...
// Asociamos nuestra direccion y puerto a un file descriptor.
// La estructura servidor esta previamente inicializada.
error=bind(sock, (struct sockaddr*) &servidor, sizeof(servidor));
if (error<0) {
printf("Error en el \"binding\"!\n");
exit(error);
}

write(1,"SERVER OK - Esperando comunicacion...\n\n",37);

while (1) {
// Escuchamos por el file descriptor, o lo que es lo
// mismo, escuchamos por el puerto indicado.
listen(sock,1);

// Inicialitzamos el tamaño del cliente (no tiene nada que
// ver con el problema).
clilen=sizeof(client);

// Aceptamos la comunicacion entrante y guardamos el file
// descriptor en newsock.
newsock=accept(sock,(struct sockaddr *) &client, &clilen);

// Forknicamos (no explicare aqui la estructura cliente-servidor)
pid=fork();

if (pid==0) {
close(sock);
// Controlamos el error
if (newsock<0) {
printf("Error en el nuevo socket\n");
exit (0);
}

// Y si no hay error...
else {

printf("Puerto donde recibimos el
accept: %d\n\n",client.sin_port);
while (1) {
...



Bien, es un fragmento de codigo de un servidor tipico. Las lineas interesantes y a comentar son la del bind, la del listen y la del accept, que son las que contestan a la pregunta.
La linea del bind lo que hace es crear un file descriptor que simbolizara el puerto por el que "escuchamos" la red. Si la funcion tiene exito, podremos hacer un write por ese file descriptor y lo que escribamos se transmitira.
Ya tenemos nuestra conexion creada y simbolizada en un file descriptor. Ahora utilizamos la funcion listen para hacer que el programa escuche el puerto a la espera de alguna comunicacion. Esto es, nuestro programa le cedera el control al sistema y este tan solo volvera al programa cuando reciba comunicacion a traves del puerto designado.
Y aqui es donde llega la madre del cordero. Cuando la funcion listen devuelve el control es que alguien intenta conectar. Pero aun no esta conectado tal y como entendemos eso de manera intuitiva, sino que el sistema lo tiene en una cola de conexiones pendientes. Ahora, con la llamada a accept, lo que hacemos es sacar la primera peticion de la cola y crear un socket, pero no lo creamos con el puerto de escucha sino que el sistema nos asigna uno de los puertos libres para crear la conexion.

Espero que con esto haya quedado mas claro lo que sucede con todo el tema de los sockets, que hasta que no se trabaja un poco con ello es bastante abstracto.

lunes, enero 01, 2007

Doblaje del Doom 3

Hacia un huevo que no escribia aqui. Entre trabajo y universidad no hay manera de inspirarse un poco xD En fin...

Hoy queria escribir acerca de un videojuego y por un tema concreto. Hace un tiempo estuve escribiendo algo que al final no postee y que tenia relacion con los videojuegos y la publicidad. Lo tengo guardado por algun sitio pero no creo que vaya a ver la luz. La cuestion era, en definitiva, que la industria del videojuego ha pasado de ser un mero entretenimiento a ser algo en lo que se fijan empresas que no pertenecen a este sector. Los casos que ponia como ejemplo eran los juegos Burguer king que salio en spectrum y otros ordenadores en los 90, el Global gladiators (de Mc Donald's), la mayoria de la marca EA (hay publicidad por todas partes), el Wipeout pure (tuvo add-ons de marcas como Coca-cola) y unos cuantos mas que ahora no recuerdo. Es normal joder, si en el cine hay patrocinadores y la gente compra, en algo que estas participando activamente y que puede engancharte no durante unas horas sino durante unos meses como no va a haber un interes en poner propaganda? Seria estupido desaprovecharlo.

Pues bien, despues de haber pensado y hablado sobre este tema muchas veces, de tanto en tanto uno se lleva una decepcion. Es lo que me paso el otro dia cuando probe la version en castellano de Doom 3. En ingles ya la habia probado y es genial en todos sus aspectos; en castellano solo cambian los doblajes y los textos de las PDA's, paneles y de las ayudas. Con respecto a los textos nada que comentar, son correctos. Los doblajes en cambio son una puta mierda.

Uno de los mejores momentos del juego, para mi gusto, es el momento de la invasion. En todo momento se escuchan transmisiones por radio de marines, sonidos de ametralladoras, ruidos estaticos y ruidos de lo que supuestamente uno se va a encontrar en el juego. El cambio de las voces en ingles a las voces en castellano es abismal. En ingles tienes la sensacion de lo que te intentan transmitir en el juego: alguien o algo acaba de salir de la nada y esta cargandose a todo lo que encuentra, hay caos y los marines estan cagados de miedo. En la version en castellano da la sensacion de que tienes a los fumigadores en tu casa y estan matando cucas, y esperaban encontrar 100 y han visto que hay unas cuantas mas, pero que tampoco va a quitarnos el sueño eh? Se matan, pim pam y listos.

Un par de ejemplos:
Breaking through the walls

Atravesando las paredes

Ni punto de comparacion no? Pues el que mas me ha impactado es este.

There, get him

Ahi! a por el a por el a por el!

Pero como lo dice asi??? Quien coño ha doblado eso??? A ver, que se supone que estas en un planeta desierto y de repente aparecen unos bicharracos que se comen a la peña joder, que no le estas diciendo a tu hijo o a tu perro que atrape a un conejo!
Yo entiendo que haya gente que juegue para relajarse, de hecho de eso se trata (y para divertirse), pero ya que hacemos las cosas que por lo menos se hagan bien, que aun hay gente a la que le gusta jugar viviendo un poquillo el asunto! Un desastre.

Y esto en la escena en la que invaden Marte. Pero es que todo es mas o menos asi. De cada 2 personajes que encuentras, 1 de ellos tiene la voz totalmente carente de sentimiento o expresion. El Dr. Bertruger tiene voz de chaval joven, cuando en el juego (y en ingles) da todo el aspecto de viejuno casi decrepito. En mas de un caso, la gente que encuentras te llama "coleguilla"... joder!

En fin, me extenderia bastante mas pero no vale la pena. Si alguien quiere comparar puede hacerlo buscando los archivos de voces en el pak003.pk4 (ingles) y en zpak000.pk4 (castellano).

...y se supone que el castellano lo habla un huevo de gente. No quiero ni pensar el destrozo que hubiesen hecho si me lo doblan al catalan :'(

Hay mas ejemplos de doblajes de mierda. Ahora solo me viene a la mente el Forgotten Realms: Demon stone, pero recuerdo haber estado delante de la pantalla muchas veces y pensar "Pero esto lo ha traducido un toxicomano o que?".

Pero eso no significa que siempre sea asi: Fifa 200X es una saga que tiene buenos comentaristas, Baldur's gate II: Shadows of Amn es impresionante (y debe tener mas de 50 dobladores)...

Una pena lo de la version del Doom 3. Si alguien aun no ha jugado y es aficionado a estos mundilos, decir que ya hace añito y medio que salio. Por lo demas, mucho mejor jugar al original, sin duda.



Una fotillo de Doom 3: Colgado