por kaiser » Mar May 31, 2011 11:05 am
Hola vib. Nunca he utilizado SDL_Net así que no entiendo muy bien todo lo que dices en tu post, pero hace un tiempo programé un pequeño chat con las librerías de sockets de python y me funcionaba perfectamente si lo ejecutaba todo dentro de un solo equipo (IP:127.0.0.1 ) o si lo ejecutaba todo dentro de la red local utilizando IPs privadas (192.168.1.X) pero fallaba en el momento en que uno de los clientes se intentaba conectar desde otra red y por lo tanto tenia que utilizar la IP pública. Creo que ésto es lo que te ocurre a ti así que te comento.
Cuando utilizas un router tienes dos redes: de router para adentro tienes tu red privada con tus ordenadores de casa y usando IPs 192.168.1.X, y de router para afuera tienes la red pública que básicamente es Internet. Los router utilizan un sistema llamado NAT que hace lo siguiente: el equipo PC1 quiere enviar un paquete, éste llevará por ejemplo la siguiente información <IPorigen=PC1 ; PORTorigen=2000> el router recibe ese paquete y lo modifica dejándolo así <IPorigen=Router ; PORTorigen=3400> y en una tabla interna apunta que todos los paquetes que reciba dirigidos al puerto 3400 debe reenviarlos a PC1 ; 2000.
Verás entonces que cuando deseas utilizar la red pública los paquetes no llevan ni la IP correcta ni el PORT correcto, sino que ambos han sido modificados.
Ésto no supone un problema cuando la comunicación se produce con un servidor de Internet, ya que éstos no utilizan NAT. En éste caso si te quieres comunicar con el servidor con IP=SERVER1 en el puerto 80 simplemente incluirás éstos datos en los campos de IPdestino y PORTdestino y puesto que el NAT solo modifica los campos de origen el paquete llegará correctamente a su destino. A su vez el servidor responderá a los datos de origen que aparezcan en el paquete, éstos si han sido modificados pero en cualquier caso se corresponden con la IP de tu router y el puerto que él halla decidido asignar por lo tanto los paquetes de respuesta llegarán correctamente a tu router y el sabrá reenviarlos a tu PC.
El problema viene a la hora de comunicar dos equipos que usen NAT ya que ninguno de los dos sabrá a que IP y puerto debe dirigirse realmente.
Para solucionar ésto la mayoría de aplicaciones P2P (peer to peer) como Skype utilizan intermediarios no NATeados de tal manera que la comunicación no se produce realmente de forma directa entre los dos clientes sino a través de una especie de servidor.
De forma más casera algunos routers permiten configurar manualmente el NAT, es decir, configurar manualmente que puerto asignará el router a un determinado proceso ejecutándose en una determinada IP. Ésto hay que hacerlo para poder jugar a algunos juegos en red así que a lo mejor te suena el proceso.
Espero haberte ayudado.
Un Saludo!
De la API al IDE y del IDE a la API.