12 sept 2004

12/9/04: Multi-Casting

Diario de Guerra de Alejandro González, Alias "WaaghMan". Trigesimoquinta anotación:



Hoy ha sido un día extraño. Me lo he pasado en su mayor parte viendo capítulos de Ranma (mis padres no dormían en casa, y en una noche el emule terminó 5 capítulos de ranma mas otros tantos de variadas series); y programando cosas para el PFC.



Bueno, eso de "programando cosas" es muy relativo. Realmente, sólo ha sido una "cosa" la que me he pasado casi todo el día programando.



Como no tenía muchas ganas de continuar lo de los menús, y como el siguiente menú que tocaba era el de "unirse a partida", que debería mostrar una lista de partidas creadas, me puse a pensar cómo haría para hacer un buscador de partidas en red local.



No es cosa fácil, el TCP no permite otra cosa que no sea hacer un intento de conexión para cada ip de la subred (al menos que yo sepa), y en ese caso también haría falta determinar la subred en caso de que haya diferentes interfaces (ADSL y Ethernet por ejemplo).



Así pues, pensé en hacer un broadcast, cosa que dimos en Redes, pero resulta que TCP tampoco permite eso (y es lógico, dado que si con un sólo socket te conectas a muchos clientes, no sabrás después de quién son los datos y cosas así).



Al final, me decidí por ir programando un socket UDP, que permitiría hacer un escaneo de la red local más rápidamente (además permite el broadcast).



Mientras lo programaba (y tras superar dos errores extraños que me costó mucho solucionar, relacionados con cierta librería de windows), vi que también había soporte para Multicast.



Para los que no lo sepan, el Multicast consiste en grupos que se forman y que al enviar un mensaje a ese grupo, todos los miembros reciben una copia (bueno, no es seguro al 100%, dado que se basa en UDP).



Así que una vez conseguí hacer un "Hola, mundo" en UDP, me puse a programar el multicast.



Primero un error molesto (relacionado con las librerías de windows antes mencionadas), que también me costó solucionar, pero al final corregí.



Después un error incomprensible, que solucioné de pura casualidad... Me explico.



El problema era que aunque enviaba el mensaje, el receptor (o receptores) nunca lo recibían. Muy raro, no había ningun aviso de error en los métodos ni nada parecido.



Tras mucho probar (MUCHO probar), apagué el ordenador de al lado (lo había encendido para probar el UDP de un pc a otro). Y entonces funcionó :|.



Es decir, el multicast no se envía los datos a si mismo en una LAN. No puedes hablar contigo mismo si estás conectado :S. Una vez descubierto el fallo, probé a hacer el multicast entre dos pc's y funcionó.



Así que al final la solución para buscar servidores es...



1-El servidor se une a un grupo de Multicast, junto al resto de servidores de la red local.



2-Cuando un cliente hace una búsqueda de servidores, envía un mensaje a ese grupo. En principio lo recibirán todos los servidores (estamos en una LAN, no suele haber paquetes perdidos), y contestarán al emisor con los datos de partida, etc. Por último, el cliente se enviará a sí mismo el mismo mensaje (por si hubiese un servidor creado en ese mismo Pc).

Y ya está, todo debería de funcionar y el mundo sería un lugar más feliz.



Veamos si en la práctica es cierto lo del lugar más feliz.



Mañana no creo que pueda trabajar tanto, pero intentaré terminar algunos controles y menús más...

No hay comentarios: