ELO-330: Programación de Sistemas
Tarea 4: Servicio de conexión entre redes privadas

Objetivos: En esta tarea usted implementará un servidor concurrente basado en hebras.

Introducción

Mientras IPv6 no sea difundido ampliamente, seguiremos viendo redes privadas conectadas a Internet a través de NATs. Esta situación es común en IoT y en en smartphones con acceso a Internet. Al salir a través de un NAT, los dispositivos en esta red pueden acceder a servicios en Internet pero no pueden ser contactados por equipos fuera de su red. Así, por ejemplo, un sensor en domótica puede reportar su estado fácilmente a un ente central a intervalos regulares, pero su estado no puede ser consultadode forma asíncrona desde Internet. Se puede acceder al estado del sensor en el servidor central, pero su valor no será el actual. Para que éste sea reciente, debemos actualizar regularmente su valor en el servidor central con el consiguiente aumento de tráfico.

Ciertamente existen soluciones al problema descrito previamente. Una de ellas consiste en crear una red virtual sobrepuesta. Uno de tales productos es ofrecido popr zerotier.com. La idea básicca es disponer un servidor con IP en Internet al cual un nodo se conecta con una aplicación especial que crea una interfaz de red virtual en ese nodo. Se establece una conexión desde el nodo (posiblemente detrás de un NAT) hasta el servidor en Internet. La interfaz virtual creada recibe una IP privada perteneciente a la sub-red que el usuario del nodo define. Así múltiples diispositivos se pueden conectar a una misma red virtual y sus aplicaciones comunicarse transparentemente como si formaran parte de la misma LAN.

En esta tares se pide crear un servicio simple al estilo de lo descrito en el párrafo previo. No se creará una interfaz de red virtual, sino un nodo se conectará vía TCP a un servidor en Internet y a través de éste podrá intercambiar información con otro nodo también conectado al servidor. Se logrará así la comunicación entre dos nodos no importando si están o no detrás de un NAT. Para el ejemplo del sensor en domótica, éste se debería conectar al servidor central y luego otros podrán consultar su estado actual vía una consulta al sensor mismo evitando así tráfico  y procesamiento innecesario.

Nombre:  sdt : Software defined connection
                tclient: test client
Sintaxis: sdt <puerto>
               tclient <server_sdt> <puerto_sdt> <connection_number>
<puerto> y <puerto_sdt> corresponden al puerto donde se ofrece el servicio de conectividad de parte de sdt.
<puerto_sdt> es la IP o nombre de la máquina donde corre sdt.
<connection_number> un entero de 32 bits  (unsigned long) que representa la conexión a la cual un programa se conecta.

Descripción
    sdt es un servidor concurrente el cual maneja el estado de las conexiones en uso. Una conexión permite vincular a sólo dos clientes conectados a sdt y de forma bidireccional. Cuando un cliente se conecta al servidor vía TCP, debe enviar un mensaje de 4 bytes  de largo con el número de su conexión. Si ese número ya es conocido para sdt y asociado a éste existe sólo un cliente, dst reenviará al otro cliente todos los datos que lleguen desde un cliente. Esto se hace en ambas direcciones. Si el número de conexión no era conocido por sdt, éste lo registra y no leerá datos desde ese ciente mientras no haya otro conectado. Si el número de conexión rrecibido desde un cliente ya estaba asociado a otros dos clientes, sdt cierra la conexión con ese cliente.
   tclient es un programa de prueba del servicio ofrecido por sdt. tclient se conecta a sdt y envía el número de conexión. Luego tclient enviará por esa conexión todo lo que el usuario escriba en su entrada estándar y mostrará por pantalla todo lo que llegue a tclient por la conexión establecida.
   Múltiples pares de clientes pueden ser conextados a través de sdt. Cuando los clientes cierran su conexión, sdt desvincula a ese cliente del número de conexión usado. Un nuevo cliente puede iniciarse y quedará conectado al cliente asociado previamente a ese mismo número de conexión.

Evaluación de la Tarea y qué entregar: revisar las instrucciones para entregar y evaluar su tarea.

Recomendaciones
* Revisar función atol()
* Para probar su tarea se recomienda: correr sdt, por ejemplo en aragorn. luego ejecutar:
   $ mkfifo puente
   $ cat > puente
  Luego en otra ventana usted ingresa:
   $ tclient <server_sdt> <puerto_sdt> <connection_number>  < puente
  La idea es separar en dos ventanas el texto que usted escribe en consola (que considera echo a pantalla) del texto que usted recibe por la conexión a sdt.
* Más ayuda puede ser incluida en la medida que surjan vuestras preguntas.
* Haga su tarea de a poco y con tiempo. Con gusto atenderé todas sus preguntas en especial en clases y horas de atención en oficina.