Algunas viejas cosas

lunes 2 de noviembre de 2009
Estoy en este momento ordenando mis cosas y revisando unos cds he encontrado tres viejos artículos que intenté escribir hace como 6 años ya, dos están terminados y otro está solo a medio camino, igual los estoy publicando en este post ya que puden ser de utilidad para alguien y sino igual para recordar viejos tiempos :D.

-------
Sockets en Tcl.
--------------------

Este es mi tercer artículo, Hace un año aprendí a programar en este lenguaje debido a que lo necesitaba para una materia y la verdad me parece muy bueno, es lenguaje script pero es muy bueno. En este artículo se intenta explicar como trabajar con sockets en Tcl de una forma fácil y rápida.


INDICE
-----------


- Introducción

- Abriendo un Socket como Servidor

- Abriendo un Socket como Cliente

- E/S asíncrona con Sockets

- Demo

- Despedida

-------------------------------------------------------------------------------

- Introducción.
-------------------


Los sockets son usados en todo tipo de programa en red, para comunicar dos computadores o dos programas en la misma máquina. El modelo de Socket es muy usado en redes TCP/IP. Algunos programas como "servidores" escuchan en un puerto particular. Cuando algún programa como "cliente" inicia una conección, el "servidor" responde y comienza a leer la información del cliente, y escribe información cuando es necesario. Muchas de las operaciones de lectura y escritura son a la salida/entrada estandar o sobre archivos, pues esta operación es exactamente la misma sobre sockets.


- Abriendo un Socket como Servidor.
------------------------------------------------


Código ejemplo:
set trigger 0
set s [ socket -server openchan 5000 ]
vwait trigger

Explicación:
La segunda línea abre un socket sobre el puerto 5000; cuando el cliente se conecte el argumento "-server" es invocado y en este caso se ejecuta el procedimiento "openchan". Los parámetros del manejador de archivo para la conección, la dirección y el puerto del cliente son automaticamente pasados. La tercera línea es "vwait" que suspende la ejecución del programa hasta que la variable "$var" cambie.

El procedimiento "openchan" debe recibir estos parámetros ( manejador de conección, puerto y dirección ) y decidir cual será la forma de comunicación entre cliente y servidor y la forma de retornar los datos.


- Abriendo un Socket como Cliente.
----------------------------------------------


Una vez creado el servidor y corriendo, basta con hacer:

valtovar@dintev articulos $ nc localhost 5000

Para darnos cuenta de que funciona perfectamente, sacará un error debido a que aún no hemos escrito la función "openchan" la cual debe estar antes del socket para que entre en el "scope" del socket, pero esto indica que la conección fue exitosa.

Una vez testeado nuestro servidor continuamos con el cliente. Muy seguramente deseamos que nuestro cliente realice algunas funciones, pues aquí está el código de un simple cliente que solamente abre una conección y escucha.

set s [ socket localhost 5000 ]
while { [ gets $s line ] != -1 } {
puts $line
}


- E/S asíncrona con Sockets.
------------------------------------


Ahora si mostraré nuestra función "openchan" la cual debe estar del lado del servidor

proc openchan { chan dir puerto }
{
% setea flags para el canal de comunicación.
fconfigure $chan -blocking 0 -buffering none

% ejecuta cuando hay datos para leer en el canal.
% es importante para recibir y atender a cada cliente.
fileevent $chan readable "readchan $chan"

% imprime del lado del servidor.
% $chan es el manejador de conexion.
% $dir es la direccion del cliente.
% $puerto es el puerto del cliente.
puts stdout "Conexión aceptada $dir:$puerto ( $chan )

% imprime del lado del cliente.
puts $chan "Servidor leyendo"
}

En la línea 2 se configura el canal de comunicación con algunos flags; "blocking" es para que el canal sea blokeante o no, en nuestro caso, es no blokeante. Es necesario colocar fileevent debido a que como es no bloqueante, necesitamos que cuando existan datos en el canal para leer, se ejecute este script y los lea.


- Demo.
---------


Esta es un pequeño chat modo texto creado en tcl para demostrar el manejo de sockets, ejecuta el server.tcl primero y luego dos veces el client.tcl para que se vea en ejecucion.


- Despedida.
---------------


Bueno, con esto termino la versión 0.1 de mi artículo el cual se limita a explicar de forma muy basica el uso de sockets en tcl, para proximas versiones voy a colocar mas tips interesantes sobre el manejo de sockets en tcl.
-------

El siguiente irá en otro post

0 comentarios: