Showing posts with label EJEMPLOS. Show all posts
Showing posts with label EJEMPLOS. Show all posts

Monday, December 3, 2007

Como funciona HTTP como Separador de Mensajes TCP

Tal como ya había comentado en un post anterior, TCP es un Protocolo de Control de Flujo de Datos, no de Mensaje de Datos por lo que es necesario implementar un separador de Mensajes sobre TCP. ¿Qué exactamente Hace un Separador de Mensajes? Un separador de Mensajes es un conjunto de reglas que se aplican sobre la transmisión de datos para saber de que parte de que flujos comienzan o finalizan los mensajes, casi siempre el Separador de Mensajes se implementa con un Encabezado y un Contenido donde una de las múltiples funciones del encabezado es el de informar del tamaño total del cuerpo del mensaje en caso de que exista. Protocolos como HTTP implementan su propio separador de Mensajes. Ejemplo:

HTTP/1.1 POST /

Content-Length:16

txtNombre=Johan

El ejemplo anterior es un mensaje HTTP, se compone de un encabezado y un cuerpo. El encabezado se compone de un conjunto de Líneas separadas por un tabulado LFCR?? Que se separa del cuerpo del mensaje por una línea en blanco. Si el encabezado contiene una línea Content-Length entonces después de la línea en blanco se recibirá como cuerpo del mensaje el número total de bytes que se especifico en la línea Content-Length, si no se especifica Content-Length, entonces el mensaje se compone solo del encabezado y los siguientes bytes recibidos después de la línea en blanco son tomados como el Encabezado de otro Mensaje.

Para el ejemplo del Mensaje HTTP que se mostro anteriormente corresponde a el siguiente conjunto de bytes:

72, 84, 84, 80, 47, 49, 46, 49, 32, 80, 79, 83, 84, 32, 47, 10,13,67, 111, 110, 116, 101, 110, 116, 45, 76, 101, 110, 103, 116, 104, 58, 49, 54,10,13,10,13,116, 120, 116, 78, 111, 109, 98, 114, 101, 61, 74, 111, 104, 97, 110

Debido a que el encabezado del Mensaje HTTP es siempre ASCII cada byte del encabezado corresponde a un carácter ASCII, la combinación de byte 10(LF, Representado en Espace Unicode de C# como ‘\n’) y 13(CR, Representado en Escape Unicode de C# como ‘\r’) indican que finaliza una Linea del Encabezado HTTP. El dato binario anterior compone un mensaje HTTP completo pero ese dato binario puede recibirse en multiples flujos de datos TCP de cualquier tamaño, Es decir, que podríamos recibir:

  1. 72, 84, 84, 80, 47, 49, 46, 49, 32, 80, 79, 83, 84, 32, 47, 10

  2. 13,67, 111, 110, 116, 101, 110, 116, 45, 76

  3. 101, 110, 103, 116, 104, 58, 49, 54,10,13,10,13,116, 120, 116

  4. 78, 111, 109, 98, 114, 101

  5. 61, 74, 111, 104, 97, 110

Cuando se está percibiendo datos TCP y haciendo un parsing para Formatear Mensajes, se tiene que saber que bytes corresponden a el encabezado del mensaje actual, el contenido del mensaje actual o el encabezado de los siguientes mensajes que se recibirán. Las operaciones a realizar son las siguientes:

  1. Leer todas las líneas del encabezado hasta encontrar una línea en blanco, que equivale a encontrar la secuencia de bytes 10,13,10,13.

  2. Si el encabezado contiene una sentencia Content-Length y su valor es mayor a 0, entonces después del encabezado se tomaran cuantos bytes se reciban como contenido del Mensaje hasta agotar la cantidad especificada. Ejemplo: Si se recibe en el encabezado la línea ‘Content-Length:3563’, entonces se tomaran los 3563 bytes que se reciban en uno o más flujos de datos después de encontrar la secuencia 10,13,10,13.

Ejemplo:

Ultima Línea del Encabezado

Fin de Línea en Blanco

56

34

673

10

13

10

13

43

48

34

Final de Encabezado HTTP

Contenido

En una proxima entrega explicare como se ha implementado este Procolo en C#.

Monday, May 21, 2007

DataConnection.php (PHP ADO.NET)

Estoy trabajando actualmente en un proyecto en PHP5/PostgreSQL8 y la verdad que odio la programacion funcional asi que en lo posible he encapsulado el acceso a datos a la base de datos usando las siguientes funciones pg_connect, pg_exec, pg_cmdtuples, pg_close, pg_numrows y pg_fetch_row en las siguientes clases:
  • DataCommand
    • Open: void
    • ExecuteNonQuery : int
    • ExecuteReader : DataReader
    • Close
  • DataReader
    • Read
    • GetField
Lo hice lo mas parecido a ADO.NET porque es el model de acceso a datos de costumbre para mi. La hice en 30 Minutos y probablemente despues deba refinarla, por ejemplo cambiar el metodo Open de void a bool o causar una exception en el caso de conexion fallida pero aun estoy buscando como hacer un buen registro de errores. Asi es como lo estoy usando: ExecuteNonQuery("INSERT INTO tabla1(id,name) values(nextval('tabla1_seq'),'Valor')") . " Insertados "; $cmd = NULL; $cmd = ConnectData(); $reader = $cmd->ExecuteReader("Select Id from tabla1"); while($reader->Read()) { echo $reader->GetField(0) . " "; } $reader = NULL; $cmd = NULL; echo "HELLO PHP"; ?> Ambas clases tienes destructores para eliminar los datos no utilizados lo mas rapido posible. En fin es solo un ejercicio que despues pienso utilizar produccion y encuentro la sintaxis del lenguage y su perfomance bastante aceptables. Lo cierto es que estamos usando PHP despues de darnos un gran golpe usando Mono/XSP 1.2.3 [Descargar DataConnection.php]

Friday, January 19, 2007

Enumerando la Información de las Unidades de Almacenamiento utilizando Visual Studio 2005 y C# 2.0

Materiales: DrivesInfo-Example.cs DrivesInfo-Example.zip Namespaces: System;System.IO; Clases: System.IO.DriveInfo Ensamblados: Mscorlib.dll(Referencia no necesaria) Portabilidad para Mono: Ninguna. Mono 1.2.1 Aun no ha implementado la clase DriveInfo. - Tema para examen oficial Application Development Foundation(70-536). - Certificacion MCTS. Introducción: A menudo uno necesita crear aplicaciones que guarden archivos(XML,TXT,DAT) en el Sistema de Archivos de Windows y por supuesto necesitara saber que unidades y que espacio libre le quedara a cada unidad del usuario. En Microsoft .NET Framework 2.0 se complemento el namespace System.IO con clases y metodos que proporcionan la informacion que necesitamos: Ejemplo: 1) Obtener las instancias de DriveInfo con la informacion de cada Unidad: DriveInfo[] drives = DriveInfo.GetDrives(); 2) Iterar el Array para poder presentar la información de cada Unidad: foreach (DriveInfo info in drives) {...} (Los puntos suspensivos en el codigo dado y en los siguientes indican porciones de codigo no relevante para el paso que se esta explicando) 3) Comprobar el estado de la unidad para solicitar la informacion. Esto se hace mediante la propiedad IsReady, de otra menera si se intenta obtener la información y la unidad no esta lista se levantara una excepción de tipo System.IO.IOException. Un caso tipico de esta situación es la unidad de Diskette(que casi nunca para mi caso tiene un disco): if (info.IsReady) {...} Seguidamente podra mostrar la informacion completa de la unidad. Si se compila y ejecuta la aplicación de ejemplo obtendra un resultado similar: A:\ no tiene disco C:\:Bill gates 39070 MB 39 GB, NTFS D:\ no tiene disco E:\:WD160GB 140665 MB 140 GB, NTFS F:\:SG80GB_EMULE 78140 MB 78 GB, NTFS G:\ no tiene disco H:\:VSSD1 105 MB 0 GB, UDF