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.