60
PON: P2P Over .NET Una plataforma para redes punto a punto basada en .NET dotNetManía nº13 marzo 2005 • 6,00 (España) TodotNet Q&A Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System legal dotNetManía www.dotnetmania.com Dedicada a los profesionales de la plataforma .NET Uso no autorizado de redes WIFI: Consecuencias en el ámbito penal Web.Config Editor 2.0 Web.Config Editor 2.0 Laboratorio Construcción de clientes FTP utilizando .NET Framework • Creación y uso de servicios Web desde entornos tradicionales • Sistemas distribuidos en .NET con Remoting (II) • Interoperabilidad no administrada y migración (II) • SQL Server Analysis Services. ¡Hola cubo! (y IV) PON: P2P Over .NET Una plataforma para redes punto a punto basada en .NET MVP Online Entrevista a Prashant Sridharan Lead Program Manager del equipo de desarrollo de Visual Studio 2005 Creación de bordes redondeados en WebForms: RoundedCorners Diálogo concerniente a los principales sistemas mundiales y sus diseños arquitectónicos Diálogo concerniente a los principales sistemas mundiales y sus diseños arquitectónicos Creación de bordes redondeados en WebForms: RoundedCorners

Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET ... · Este año va a ser divertido en cuanto a rumores y declaraciones de intenciones sobre lanzamientos de versiones

  • Upload
    others

  • View
    21

  • Download
    0

Embed Size (px)

Citation preview

PON: P2P Over .NETUna plataforma para redes punto a punto basada en .NET

dotNetManíanº

13 m

arzo

200

5 •

6,00

€(E

spañ

a)

TodotNet Q&A

Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System

legal

dotNetManíawww.dotnetmania.com Dedicada a los profesionales de la plataforma .NET

Uso no autorizado de redes WIFI: Consecuencias en el ámbito penal

Web.Config Editor 2.0Web.Config Editor 2.0Laboratorio

Construcción de clientes FTP utilizando .NET Framework •Creación y uso de servicios Web desde entornos tradicionales •Sistemas distribuidos en .NET con Remoting (II) •Interoperabilidad no administrada y migración (II) •SQL Server Analysis Services.¡Hola cubo! (y IV)

PON: P2P Over .NETUna plataforma para redes punto a punto basada en .NET

MVP Online

Entrevista a Prashant SridharanLead Program Manager del equipo de desarrollo de Visual Studio 2005

Creación de bordes redondeadosen WebForms: RoundedCorners

Diálogo concerniente a losprincipales sistemas mundialesy sus diseños arquitectónicos

Diálogo concerniente a losprincipales sistemas mundialesy sus diseños arquitectónicos

Creación de bordes redondeadosen WebForms: RoundedCorners

Este año va a ser divertido en cuanto arumores y declaraciones de intenciones sobrelanzamientos de versiones betas, CTPs, can-didate releases y de versiones finales. Y paramuestra lo que sigue:

El rumor más espectacular y que más hacorrido es el del supuesto nombre final deLonghorn: Windows e-XPedition. Parte deWil Harris de The Inquirer (http://www.the-inquirer.net/?article=21365). Cita fuentes deMicrosoft sin decir cuáles, o sea, “rumor” enversión alfa. Y yo que no me lo creo... (quedaimpreso y podrás reirte de mí cuando veasen la caja en letras grandes: Windowse-XPedition). “Se dice” que se lanzará unaversión de Longhorn para desarrolladores afinales de abril 2005, en el WinHEC, así comoque posiblemente en el verano tengamos unaversión beta 1.

Y para rumores, los relativos a la beta 3 deSQL Server 2005. Éstos apuntaban a que labeta 3 podría estar el 31 de marzo, pero a nadiele sorprendería que los primeros en verla seanlos asistentes a los Tech-Eds a finales de juniode este año.

Después del VSLive! de San Francisco,tenemos también una pequeña tanda de fechasde publicación de versiones más. En marzotendremos una versión CTP de WinFX, queincluirá una actualización de la CTP de Avalonde noviembre, una nueva versión CTP deIndigo y una build de Visual Studio 2005 (queno sabemos aún si será la beta 2, que BillGates, entre otros, dice que está prevista parael 31 de marzo), según Soma Somasegar, vice-presidente de Microsoft Corp. de Developer Divisiony Eric Rudder, vicepresidente senior de la divi-

sión de Servidores y Herramientas, quien bro-meó diciendo que estarán en marzo... aunquesea el 38 de marzo (¿noticia o declaración deintenciones, entonces?). Algo se comenta enel desván de este mes, pero si tienes más inte-rés en la actual versión de “rumores”, puedesleerte la entrevista a Soma Somasegar que sepublica en eWeek, en: http://www.eweek.com/article2/0,1759,1757521,00.asp o visitar el sitiode VSLive! en: http://www.ftponline.com/reports/vslivesf/2005.

El mes pasado publicábamos, citandofuentes oficiales, que en febrero estarían dis-ponibles las versiones CTP de Indigo y VisualStudio 2005. Pues no, como puede verse noha sido así. Y es que hemos de tomarnos éstoscomo lo que son: simples rumores, algo asícomo la versión beta de la noticia... y, por tan-to, falibles. Ya falta poco, debemos estar ya enla beta 2 de los rumores de 2005.

En este mes publicamos una entrevista aPrashant Sridharan, Lead Program Managerdel equipo de desarrollo de Visual Studio 2005,con el que tuvimos la ocasión de charlar sobrela que fue la primera y, por muy poco tiempo,última beta de Visual Studio 2005. Con éstacerramos un ciclo de entrevistas en las quetodavía hablamos de esta versión.

Además, en este número estrenamos unasección que vamos a dedicar a los asuntos lega-les que a la mayoría de los profesionales de TIpueden interesar y que hemos denominado,en un alarde de originalidad: dnm.legal.Contaremos con la colaboración del despachode abogados Suárez de la Dehesa Abogados,especializado en propiedad intelectual e indus-trial y nuevas tecnologías.

dotN

etM

anía

<<

3

Rumores 2005... beta 2dotNetManía

Dedicada a los profesionales de la plataforma .NET

Vol. II •Número 13 • Marzo 2005Precio: 6€ (España)

EditorPaco Marín

([email protected])

AdministraciónPilar Pérez

([email protected])

Asesor Técnico/CoordinaciónMarino Posadas

([email protected])

RedactoresAntonio Quirós, Dino Esposito, Guillermo

'guille' Som, Jorge Serrano, José ManuelAlarcón, Luis Miguel Blanco, Manuel Imaz y

Pedro Pozo.

Colaboradores habitualesÁngel Esteban, Braulio Díez, Eladio Rincón,

Erich Bühler, Fernando Nogueras, JorgeCrespo Cano, José Miguel Torres, Miguel

Egea, Miguel Katrib Mora (Grupo Weboo),Octavio Hernández, Pablo Abbate, PepeHevia, Rodrigo Corral y Salvador Ramos.

Además colabora en este númeroJosé Antonio Suárez de la Dehesa

Edición y Suscripciones.netalia

c/ Robledal, 13528529 Rivas-Vaciamadrid (Madrid)

Tf. (34) 91 666 74 77Fax (34) 91 499 13 64

PublicidadMediadev

Sophie Mancini ([email protected])Tf. 93 426 22 57 - 670 99 74 64

Fax. 93 423 11 40

ImprimeGráficas Vallehermoso

www.graficasvallehermoso.com

ISSN1698-5451

Depósito LegalM-3.075-2004

<<

dnm.editorial

13dnm.sumario

Entrevista a Prashant Sridharan 10-11En el pasado Tech-Ed tuvimos la ocasión de charlar largo y tendido con Prashant Sridaran,Lead Program Manager del equipo de desarrollo de Visual Studio 2005. Pusimos especialénfasis en lo nuevo que nos ofrecía la que por entonces sería la primera beta estable.

Construcción de clientes FTP utilizando .NET Framework 13-18En este artículo se explican los conceptos básicos de las clases de la infraestructurapara gestión de red, así como también la forma de programar un cliente FTP utilizando.NET framework versión 1.0 ó 1.1.

Creación y uso de servicios Web desde entornos tradicionales 19-23Con tanto bullicio generado alrededor de los servicios Web parece que los programadoresde toda la vida (sí, los que usan COM y/o lenguajes de Script, por ejemplo) se han quedadofuera de la nueva onda. Sin embargo .NET ofrece soluciones para todo el mundo, inclusopara aquellos que no saben nada de .NET. En este artículo veremos cómo dar el salto almundo de los servicios Web desde lenguajes tradicionales como Visual Basic 6.0, usandode manera indirecta .NET pero sin tener que aprender nada nuevo.

PON : P2P Over .NET. 24-32El artículo presenta a PON (Peer to peer Over .NET): una plataforma implementadasobre la tecnología .NET, la cual permite el desarrollo de comunidades de nodos .NET.Con esta plataforma se da la posibilidad de conectar aplicaciones diferentes formandoredes de intercambio aún más universales.

Sistemas distribuidos en .NET con Remoting (II) 33-36Después de los conceptos sobre la arquitectura de .NET Remoting que vimos en la anteriorentrega, podemos zambullirnos por completo en la creación de objetos remotos. En estecapítulo veremos un tema vital, los diferentes comportamientos que pueden presentar losobjetos remotos en .NET Remoting. A menudo la primera decisión que tenemos que tomara la hora de diseñar un objeto remoto o una familia de objetos es elegir el modelo decomportamiento de los mismos.

Interoperabilidad no administrada y migración (II) 37-39La interoperabilidad de .NET desde COM es quizás mas inusual aunque sus ventajasnos ofrecen una nueva técnica en un entorno de migración e interoperabilidad. En estaentrega conoceremos cómo utilizar dicha técnica además de las consideraciones previaspara interoperar de una manera más eficiente.

SQL Server Analysis Services. ¡Hola Cubo! (y IV) 40-45Llegó el momento de explotar los datos almacenados en nuestra base de datosmultidimensional, desde algunas de las herramientas cliente que Microsoft nos ofrece paraello. Aquí mostraremos el Examinador de cubos del Analysis Manager, Microsoft Excelutilizando el PivotTable Service, la aplicación de ejemplo que viene con Analsys Servicesy Microsoft Data Analyzer.

Uso no autorizado de redes WIFI:Consecuencias en el ámbito penal 46-47En los últimos apenas dos años hemos podido advertir la aparición, ya con verdaderamenterelevante, de sistemas de comunicaciones inalámbricas, que permiten el acceso a Interneten entornos más o menos amplios, y que, en no pocas ocasiones, exceden el ámbito deestablecimiento del titular de la red.

dnm.mvp.online 48-51Creación de bordes redondeados en WebForms: RoundedCorners

dnm.todotnet.qa 52-54Diálogo concerniente a los principales sistemas mundiales y sus diseños arquitectónicos

dnm.laboratorio 55-56Web.Config Editor 2.0

dnm.biblioteca.net 57Introducing Microsoft .NET (David Platt)Inside Microsoft Visual Studio .NET (Brian Johnson, Craig Skibo, Marc Young)

dnm.desvan 58dnm

.sum

ario

dotN

etM

anía

<<

6

dnm.noticias<<dnm.noticias

El ASP.NET 2.0 Tour llega a España

no

ticia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s

La gira europea ASP.NET 2.0 Tour llegó a Madrid para presentar la últimaversión de la tecnología en desarrollo Web de Microsoft

Microsoft celebró el pasado 21 de febrero enMadrid, un evento para mostrar a la comunidad dedesarrolladores española las últimas novedades en latecnología ASP.NET. Asistieron alrededor de 200 desa-rrolladores que pudieron ver la primera demostraciónen directo en España de las novedades en herramien-tas de desarrollo Visual Studio 2005, ASP.NET 2.0para desarrollo Web y Visual Studio 2005 Team System.

Los asistentes tuvieron la oportunidad de compro-bar los cambios realizados en la estructura básica deASP.NET a través de las ponencias de Eric Rudder,

vicepresidente senior dela división de Servidoresy Herramientas y BrianGoldfarb, jefe de pro-ducto del equipo deHerramientas y Plata-forma de Microsoft.

Esta sesión delASP.NET 2.0 Tour for-ma parte de una girapor 17 ciudades europeas en la que los mayores expertosen ASP.NET de todo el mundo muestran en directo ypor primera vez la última versión de la tecnologíaMicrosoft en desarrollo Web.

Los desarrolladores tuvieron la oportunidad dever las presentaciones y demostraciones en las quese mostraban las novedades de ASP.NET 2.0, entrelas que caben destacar: la mejora en el diseño de lacapa de presentación, las master pages y los temas,las mejoras en el editor -especialmente en lo quetoca a HTML-, la gestión del caché, mejoras en laseguridad, en las facilidades para la localización deaplicaciones, etc.

Más información en: http://www.microsoft.com/emea/msdn/aspontour

La empresa Bowne GlobalSolutions (BGS) será la encarga-da de la localización de VisualStudio 2005 en ocho idiomas: japo-nés, chino simplificado, chino tra-dicional, coreano, francés, italiano,alemán y español. Ésta es ya la ter-cera versión de Visual Studio, des-pués de las anteriores 2002 y 2003,que BGS localiza para Microsoft.

El proyecto contará con unequipo de más de 400 personasentre jefes de proyecto, localiza-dores especializados en software y

documentación de ayudas, tra-ductores, revisores, expertos en

la materia, especialistas en maque-tación, ingenieros y comprobado-res (testers). El proyecto tiene unámbito global pero cuenta con tra-ductores localizados en cada paíspara conseguir la redacción másacertada y respetuosa con cada cul-tura. La gestión global del proyec-to se hará en Madrid y Taipei(Taiwan), mientras que el testing yla ingeniería se hará entre Madridy Beijing (China).

Según Jim Fagan, presidentey CEO de BGS, “BGS es la única

compañía que puede aportar elnúmero de especialistas que se preci-san a esta escala -dada la compleji-dad de la materia- a lo largo de ochoidiomas, incluyendo localizadores queestán especializados en software.Nosotros tenemos la experiencia, losmétodos y las personas que garanti-zarán el éxito del proyecto”.

dotNetManía, colaborará conBGS en calidad de expertos en lamateria para la versión en castella-no de Visual Studio 2005, apoyan-do a los traductores en la traduc-ción de términos, así como en lafase de testing.

Eric Rudder

Bowne Global Solutions localizará Visual Studio2005 en los principales idiomasEl proyecto de localización de Visual Studio 2005 a los idomas másimportantes se hará entre Madrid,Beijing y Taipei

El 4 marzo dotNetSolidario inaugu-ró su Web en www.dotnetsolidario.com, através de la cual se dará a conocer lasacciones solidarias relacionadas con lastecnologías de la información. Este por-tal nace con la intención de darle un ladomás humano a la tecnología y, gracias a lautilización de la misma, conseguir ayudara los más necesitados y promover accio-nes solidarias. Además, a través de esteportal se ofrecerán servicios gratuitos paraONG's como hosting, desarrollos Web,software y formación, entre otros.

Más información en: http://www.dot-netsolidario.com

dotNetSolidario inagura su Web

dnm.noticias<<

dnm.noticias

dotN

etM

anía

<<

7

Microsoft ha puesto en marcha el pro-grama de becas de postgrado de MicrosoftResearch, un proyecto que refuerza elpapel de la compañía en el ámbito acadé-mico, y que se centra en reconocer y apo-yar a aquellos estudiantes de tercer cicloque destaquen en sus áreas de investiga-ción, y que posean el potencial para con-vertirse en relevantes líderes científicos dela Europa del futuro.

Este programa ofrece apoyo a estu-diantes de informática, matemáticas,ingeniería electrónica y física. Asimismoy de manera especial, presta ayuda en suinvestigación a los alumnos de las áreasde biología, químicas, neurociencia,inmunología, ciencias sociales, econó-micas y ecología, que sientan especialinterés por la ciencia.

Podrán optar a estas becas todos losestudiantes europeos de tercer ciclo, oaquellos que hayan solicitado su admi-sión en estudios de postgrado de algunauniversidad europea y que comiencen acursarlos a partir del mes de octubre de2005. Los alumnos que formen parte delprograma de Microsoft Research recibi-rán, durante tres años, una beca de90.000 euros.

En los próximos dos años el programade ayuda a alumnos de postgrado deMicrosoft apoyará a no menos de cien estu-diantes, potenciando así el desarrollo inte-lectual de los investigadores europeos.

Microsoft pone en marcha unprograma de becas para estu-diantes de postgrado

Enterprise Library es unacolección de 7 bloques de apli-cación (applications blocks) concódigo fuente que puede ser usa-

do “tal cual”, ampliardo o modificado por losdesarrolladores para usarlo en sus proyectosempresariales. Enterprise Library tiene versio-nes nuevas y actualizadas de los bloques de apli-cación que actualmente se distribuían por sepa-rado. Todos los bloques de aplicación deEnterprise Library han sido actualizados focali-zando particularmente en la consistencia, exten-sibilidad, faciliad de uso e integración.

Los bloques de Enterprise Library te ayu-darán en los siguientes escenarios: caching,

configuración, criptografía, acceso a datos,manejo de excepciones, acceso de usuarios yseguridad.

La siguiente versión de Enterprise Libraryestará disponible próximamente, junto con ellanzamiento del Framework .NET 2.0 y VisualStudio 2005. Más información y descargas en:http://www.microsoft.com/practices.

Connected Systems Business Kit es una colec-ción de aplicaciones de ejemplo, presentacio-nes, white papers y vídeos que ilustran cómoimplementar sistemas conectados y arquitec-turas orientadas a servicios usando las tecnolo-gías actuales. Puede pedirse gratuitamente en:http://www.microsoft.com/connectedsystems

Patterns & practices Enterprise Libraryy Connected Systems Business Kit Microsoft ha anunciado la disponibilidad de estos nuevosrecursos para desarrolladores empresariales que quieranconstruir sistemas conectados

Crystal Reports XI aporta lassiguientes características nuevas:• Crystal Reports XI proporciona a

los desarrolladores drivers de datosmejorados que hacen más fácil elacceso a, virtualmente, todas lasfuentes de datos.

• En vez de construir cientos de infor-mes individuales, los desarrollado-res pueden ahora ditribuir plantillascon menús desplegables que permi-ten a los usuarios finales, personali-zar sus informes. Crystal Reports XItambién entrega los informes a losusuarios finales en formato RTF deforma que ellos puedan modificar-los fácilmente.

• Crystal Reports XI da a los desa-rrolladores herramientas con undiseño intuitivo para la creación deinformes. Por ejemplo, ahora losdesarrolladores pueden previsuali-zar sus informes en HTML antes deque sean publicados en la Web y dis-

tribuidos a través de la organización.Además, la nueva versión evaluaautomáticamente los datos del infor-me y da a los desarrolladores lasopciones de visualización de gráfi-cos más apropiadas.

• La nueva versión de CrystalReports también da a los desarro-lladores una zona de trabajo virtualen al que puedan organizar infor-mes, así como decidir cómo agen-darlos, gestionarlos, distribuirlos yasegurar su acceso.Más información: http://www.busines-

sobjects.com o en http://www.abox.com

Business Objects anuncia CrystalReports 11Crystal Reports 11 incluye más de 50 nuevas funcionesy nuevas características que aumentan la flexibilidad ydisminuyen la carga de trabajo de los desarrolladores

Entrevista a Prashant SridharanLead Program Manager del equipo de desarrollo de Visual Studio 2005

En el pasado Tech-Ed tuvimos la ocasión de charlar largo y tendido con PrashantSridaran, Lead Program Manager del equipo de desarrollo de Visual Studio 2005,quien fue, además, uno de los ponentes principales en la conferencia de bien-venida (Keynote). Pusimos especial énfasis en lo nuevo que nos ofrecía la quepor entonces sería la primera beta estable.

una nueva versión de Visual Studio parael final de este Tech-Ed, incluyendo muchas caracte-rísticas nuevas. ¿Podrías resumirnos las más impor-tantes en comparación con previews anteriores?

Se trata de algo más que de una CommunityTechnology Preview. Es una beta estable, en la que seha invertido ya bastante tiempo en las pruebas, y comoelemento más importante, cabría destacar la presen-cia del llamado Visual Studio Team System, el módulodiseñado para permitir el análisis y diseño de aplica-ciones. Esperamos poder publicar una nueva beta parael fin del verano (2004), y continuar la política de reno-vaciones hasta la salida final del producto.

¿Podríamos decir que la novedad más importan-te de esta versión es precisamente ese módulo (omódulos) que configuran VSTS? ¿Incluso más quelas nuevas características de ASP.NET o los nuevosconjuntos de controles para Web y Windows?

Una de las cosas en las que nos hemos fijado prin-cipalmente a la hora del diseño de esta nueva versiónha sido en los perfiles de los usuarios potenciales deVisual Studio. Quiénes lo están usando hoy, y quié-nes pueden ser los futuros usuarios. Así que se encuen-tran temas específicos que interesan al desarrolladorpuntual de Visual Basic, o de ASP.NET, y otros quetienen que ver con agrupaciones o equipos más gran-des de desarrollo, sin olvidarnos de estudiantes, afi-cionados, entusiastas, etc. De forma que hemos inten-tado un estructura fácil de entender pero al mismotiempo potente: que permita a los nuevos usuariosacercarse al producto de forma fácil, pero que inclu-ya las características que grandes equipos y corpora-ciones pueden necesitar en la construcción de soft-

ware, incluyendo responsables de operaciones, equi-pos de testeo, product managers, etc. Esperamos queel resultado sea un incremento notable de la comuni-dad de usuarios de Visual Studio, ya que podrán encon-trar prácticamente lo que quieran de forma intuitiva,bien organizada y sin olvidar ninguno de los aspectosdel ciclo de producción de aplicaciones.

A propósito, ¿cuántas personas tienes a tu cargoen el equipo de desarrollo de Visual Studio?

Bueno, en total vienen a ser unos 3000. Por una par-te, están los encargados de los diferentes departamentosde lenguajes, los encargados de los compiladores, de lainterfaz de usuario, de la integración de elementos, lalocalización a diferentes culturas, los responsables delCLR, las versiones express, y muchos otros. A todo estohay que añadir los “evangelistas” y divulgadores de tec-nología, personal de marketing, etc.

La nueva versión que estamos comentando, ¿inclui-rá mejora en la instalación de las aplicaciones? Y en con-creto en la distribución de las aplicaciones Web?

Sí. Se ha tenido en cuenta esta necesidad de formaprioritaria. No sólo se han incluido nuevas caracterís-ticas arquitectónicas de solución que pretenden facili-tar la distribución de la aplicación, sino que sen hanañadido facilidades especiales, como la posibilidad“empaquetar” sitios Web, la posibilidad de precompi-lar los ejecutables, al objeto de obtener los niveles derendimiento que se desean, y un conjunto de utilida-des añadidas al propio Visual Studio para permitir elajuste fino de las aplicaciones.

Otra posibilidad planteada es la de la edición remo-ta. ¿Va a ser eso posible aunque sólo sea para peque-ños fragmentos?

Marino Posadas

dnm.directo.entrevistas

Marino Posadas esasesor técnico y

redactor dedotNetManía, MVP de

C# y formador deAlhambra-Eidos

<< Habéis anunciado

dotN

etM

anía

<<

11

dnm.directo.entrevistas<<

Se está pensando sobre esa posibili-dad, pero no hemos determinado toda-vía su viabilidad total para esta versiónde Visual Studio. Pero estamos pen-sando en ello.

En nuestros días parece inevitable dedi-car alguna cuestión a temas de seguridad.¿Vamos a contar con algún modelo nue-vo, o bien con el mismo pero mejorado?

Bueno, esa pregunta sería más bienpara Scott (Gutrie). Es decisión suya y desu equipo lo que las nuevas característicasde seguridad Web vayan a incluir.

¿Y qué hay de los temas de accesi-bilidad? ¿Habéis seguido los estándaresrecomendados por la W3C al respecto?

Es otro de los temas importantes. Noen las versiones express de los productos,pero en Visual Studio hemos vuelto aremodelar las características de accesibi-lidad, y hemos seguido escrupulosamen-te las recomendaciones de la implemen-tación que sugerían los estándares. Y estono es solamente para las aplicaciones Web,sino que muchas de las características hansido pensadas para cumplir simultánea-mente las necesidades de las aplicacionesWindows respecto a accesibilidad.

En la actualidad, ya se conocenmuchas características del nuevo siste-ma operativo, Longhorn, que planteaun modelo de programación totalmen-te orientado a objetos, en el que existeuna separación total entre la interfaz deusuario (escrita en XAML) y el códigofuncional. ¿Consideras una buena prác-tica la migración de aplicaciones aASP.NET que ya soporta ese modelode programación, como forma de anti-ciparse estratégicamente a lo que nosespera con el nuevo sistema?

No es una pregunta fácil de respon-der. Creo que muchas compañías deberí-an plantearse esto, y considerar los pro-blemas de la migración vs. la espera de lanueva versión. La práctica de este mode-lo, desde luego, establece una ventajaestratégica, pero hay que considerar losconocimientos de los integrantes del equi-po de desarrollo, etc. Pero creo que tomaruna decisión en base a Longhorn no esuna forma adecuada de proceder. Lomejor es siempre considerar lo que senecesita en el momento actual y tomar ladecisión de acuerdo con eso.

Eso significa que si la siguiente ver-sión de Visual Studio (Orcas) tiene quesoportar la programación nativa deLognhorn, incluirá muchísimos cambiosconceptuales y estructurales, ¿no?

Bueno, indudablemente llevarámuchas cosas nuevas, y el soporte delnuevo sistema deberá de ser exhaustivo,pero es muy pronto para hablar de unproducto que está en sus primeras fases

de desarrollo en este momento. Preferiríaposponer estas cuestiones para más ade-lante, si no te importa…) No obstante,sí que puedo decirte que hay algo que losclientes deberían hacer de cara a que lamigración a Longhorn les resulte lo másfácil posible. Me refiero la construcciónde sistemas basados en los servicios Weby la arquitectura SOA.

Longhorn, sin ningún género dedudas está basado en eso, y la propiaarquitectura permitirá que la integra-ción de lo existente, si sigue estos patro-nes sea mucho más sencilla. Tanto lasaplicaciones ASP.NET como las basa-das en Windows, van a funcionar enLonghorn. Ahora, está claro que va aser un gran cambio. La gente tendríaque aprender las nuevas tecnologías aso-ciadas a esa forma de construir y utili-zar el software, que conllevará inmen-sas ventajas, pero también va a requerirde un reciclaje formativo y operativoimportante, si se quieren aprovechartodas las posibilidades.

Así que, mis consejos finales a esterespecto, no irían encaminados a carac-terísticas punteras de un producto con-creto, sino a tecnologías más globales.Siempre va a ser positivo un buen cono-

cimiento del lenguaje, de la arquitectu-ra, de los protocolos implicados en lascomunicaciones, y por supuesto de lasherramientas, como Visual Studio, quesufrirán modificaciones, indudable-mente, pero que seguirán mejorandopara presentar al usuario la mejor inter-faz de desarrollo posible, y la que mejorse adapte a las posibilidades y las nece-sidades de las nuevas plataformas.

...hemos intentado un estructura fácil de entender pero al mismo tiempo potente: que permita a los nuevos usuarios acercarse al producto de forma fácil, pero

que incluya las características que grandes equipos y corporaciones pueden necesitar en la construcción

de software, incluyendo responsables de operaciones,equipos de testeo, product managers, etc.

dotN

etM

anía

<<

13

Construcción de clientes FTP utilizando .NET Framework

En este artículo se explican los conceptos básicos de las clases de la infraestruc-tura para gestión de red, así como también la forma de programar un cliente FTPutilizando .NET framework versión 1.0 ó 1.1.

<<File Transfer Protocol o FTP pertenece a la fami-

lia de los protocolos de Internet y desde el año 1971es el favorito para la transferencia de archivos entreordenadores. A diferencia de otras tecnologías, éstano está diseñada para permitir el acceso a otra máqui-na con el fin de ejecutar programas. Si se desea estefin, entonces se deberán utilizar los servicios deTelnet, DCOM, o .NET Remoting.

Actualmente todos los servidores Web ofrecenun servicio FTP que puede ser configurado fácil-mente. Como contrapartida, Microsoft brinda lasextensiones de FrontPage, las que ofrecen caracte-rísticas de funcionalidad similar. Sin embargo, y a micriterio, FTP tiene actualmente dos ventajas impor-tantes para el desarrollador: la primera radica en quese cuenta con una interfaz de línea de comandos parainteractuar con el protocolo, lo que ofrece un nivelde detalle mayor; por su parte, la segunda es que con-figura un estándar abierto y bien documentado, porlo que es relativamente sencillo construir o integrara las aplicaciones las características de FTP tanto paraenviar o recibir archivos.

Además de los beneficios propios de transmitirarchivos a través de una red, un cliente FTP consti-tuye un excelente ejemplo para aprender más .NETFramework, debido a que ayuda a conocer algunasde las clases de la infraestructura para transmisión deinformación a través de una red.

Debo sin embargo destacar que pese a ser un buencandidato para utilizar en una red interna o Intranet,no recomiendo que se emplee en un entorno abier-to (Internet), ya que si no se cuenta con una buena

configuración de seguridad existen varios puntos delprotocolo que pueden dejar puertas abiertas y de estaforma hacerlo vulnerable.

Antes de dar un vistazo a las clases de .NETFramework vamos a repasar el funcionamiento delprotocolo, lo que nos ayudará posteriormente acomprender la utilidad y los ejemplos. De más estádecir que al final de este artículo habremos crea-do una aplicación administrada (.NET) que podráenviar a través de la red uno o más archivos a unservidor remoto. Pero antes de nadar en las clases,métodos y propiedades de la infraestructura, vea-mos el funcionamiento de FTP.

Erich Bühler

dnm.comunicaciones

Erich Bühlercolabora habitualmente con

dotNetManía. Es .NETFramework MVP,MCSD, autor

de varios libros de programacióny webmaster de vblibros.com

Utilidad del protocolo FTP

Figura 1. Cliente desarrollado en .NET framework

¿Cómo funciona FTP?

Para establecer una sesión con unservidor FTP es necesario disponer deun programa cliente específico –enWindows se incluye uno llamadoFTP.EXE– o bien utilizar el explorador.Para el primer caso es necesario cono-cer una serie de comandos que per-miten interactuar con el servidor FTP.Sin embargo, si se utiliza un navega-dor, se llevan adelante todas las ope-raciones de forma automática y total-mente transparente, aunque sin dema-siado control.

El nombre del servidor o direcciónIP, así como el usuario y contraseña,serán nuestro punto de partida y puer-ta de entrada. Básicamente, estableceruna sesión implica abrir un puerto denuestro ordenador –normalmentemayor al 1024– a través del cual seenviarán los comandos al puerto 21del servidor, así como también unpuerto adicional para la transmisiónde datos, el que se conectará al puer-to 20 del servidor. La figura 2 mues-tra la interacción entre los diferentespuertos.

El puerto 21 del servidor es el encar-gado de recepcionar los comandos yenviar las respuestas de la ejecución alcliente, mientras que a través del puer-to 20 se envían o reciben datos. El fuen-te 1 nos muestra un ejemplo sencillo deutilización de comandos mediante elcliente FTP de Windows XP.

Si es que el servidor acepta cone-xiones anónimas es posible ingresarcomo nombre de usuario la palabraAnonymous. Normalmente como contra-seña se escribe un mail, con el fin de que

el administrador conozca algo de sobreel usuario conectado. Una vez estable-cida la conexión es posible comenzar a

utilizar los comandos, los que en partese parecen en mucho a los de MS-DOSdebido a que FTP comenzó como unservicio de UNIX. Para conocer la lis-ta de comandos soportados es necesa-rio escribir la palabra Help o Help <nom-bre del comando> (ver fuente 2).

Los que aquí vemos son los llama-dos “comandos amigables” ya que per-tenecen a la aplicación cliente de FTP(en este caso de Windows XP) y noson finalmente los que se envían al ser-vidor. Cada vez que se ingresa uno de

éstos, el cliente FTP lo traduce a unao más instrucciones “especiales” queson entendidas por el servidor. Esto

se ha hecho así para evitar que el usua-rio lidie con comandos y sentenciascomplejas. Para un listado de loscomandos de servidor basta con escri-bir en la consola la palabra RemoteHelp(tabla 1).

El motivo real de conocer la lista decomandos del servidor es que cuando nosconectemos utilizando la aplicación cons-truida en .NET Framework no dispon-dremos de la opción amigable o del clien-te, y debido a ello tendremos que indicarlo que deseamos hacer mediante coman-dos de servidor. No se asuste por lo malque se ven y lo poco comprensible queparecen ya que afortunadamente sóloharemos uso de unos pocos, aunque si lacuriosidad puede más, en la siguientedirección podrá encontrar el detalle de losmismos: http://www.nsftools.com/tips/MSFTP.htm

También podemos escribir instruc-ciones de servidor en la aplicacióncliente de FTP, lo que nos facilitarásaber cómo funcionan y se comportan.Para dicho fin se debe agregar la pala-

dotN

etM

anía

<<

14

dnm.comunicaciones<<

Figura 2. Funcionamiento de FTP.

ftp> open www.miservido.comConnected to www.miservidor.com.220 Microsoft FTP ServiceUser (127.0.0.1:(none)): Anonymous331 Anonymous access allowed, send identity (e-mail name) as password.Password: [email protected] Anonymous user logged in.

ftp> cd ArchivosdeGuillermoPuertasftp>

Fuente 1

ftp> helpCommands may be abbreviated. Commands are:

! delete literal prompt send? debug ls put statusappend dir mdelete pwd traceascii disconnect mdir quit typebell get mget quote userbinary glob mkdir recv verbosebye hash mls remotehelpcd help mput renameclose lcd open rmdirftp>

Fuente 2. Comandos del cliente FTP de Windows XP.

bra literal al comienzo de la líneaseguido del comando. Esto hará que laaplicación cliente de FTP transmitaautomáticamente el comando sin rea-lizar interpretación alguna. El fuente3 muestra cómo hacer lo mismo que enel 1, pero ahora empleando los coman-dos de servidor.

Desde .NET Framework omitire-mos la palabra literal ya que no ten-dremos al cliente FTP de Windows XPdebido a que nos comunicaremos direc-tamente abriendo canales de TCP/IPmediante clases de la infraestructura.

Abriendo una conexión deTCP/IP desde .NET frame-work

Para poder transmitir datos a travésde una red necesitaremos primeramen-te crear una estructura de tipo Socket delespacio de nombres System.Net.Sockets.Ésta, básicamente proporciona un con-junto de métodos y propiedades paracomunicación y datos a través de unared. Afortunadamente también soportacomunicaciones asíncronas, cosa quepuede ser de particular interés para que

la aplicación noquede congelada ala espera o envíode información, yasí permitir alusuario continuarinteractuando conla interfaz gráficao, en su defecto,realizando otrastareas en segundoplano.

private Socket socketCliente = null;this.socketCliente = newSocket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp );

El primer parámetro correspondeal tipo de protocolo a emplear. Latabla 2 muestra alguno de los valoresposibles.

Como podemos apreciar no exis-te una opción para FTP y eso se debeparticularmente a que .NET Frame-work no tiene implementado el pro-tocolo de intercambio de archivos. Sinembargo, FTP funciona sobre TCPpor lo que si deseamos trabajar con elprimero tendremos necesariamenteque hacer uso del protocolo de IP ver-sión 4.0.

El segundo parámetro indica la for-ma de apertura del canal, el valor Streamestablece la posibilidad de envío y/orecepción de valores binarios o texto alun servidor remoto. El resto de los valo-res de este enumerado no son impor-tantes ya que rara vez se utilizan, por loque los omitiremos. Por su parte el últi-mo parámetro especifica el protocolo aemplear (vea la tabla 3). Aquí tampocofigura FTP por lo que la opción másadecuada es TCP.

Hemos creados el objeto pero toda-vía no nos conectaremos ya que debe-mos llevar acabo algunos pasos másantes de abrir el socket.

Resolviendo dinámicamenteun nombre de dominio

Un punto importante para encontrarel servidor al cual deseamos conectarnoses tener la dirección IP, como por ejem-plo 169.200.1.1. Pero ¿qué pasaría si elusuario que utiliza nuestro software deFTP ingresa un nombre de dominio comoser www.vblibros.com? Bien… tendríamosque obtener la dirección IP correspon-diente a este dominio. Para ello existe unservicio de Internet llamado DNS quecontiene un listado de nombres de servi-dores y sus direcciones IP, de igual formaque un listín telefónico. Hábilmente losingenieros que diseñaron .NET frame-work pensaron en esto ya que construye-ron una clase estática llamada DNS quelleva adelante el trabajo sin demasiadascomplicaciones. Veamos entonces cómoobtener la dirección IP de un nombre:

IPAddress dirección = null;dirección = Dns.Resolve(

"www.vblibros.com").AddressList[0];

dotN

etM

anía

<<

15

dnm.comunicaciones<<

Tabla 1. Lista de comandos del servidor.

ABOR ACCT ALLO APPE CDUP

CWD DELE HELP LIST MDTM

MKD MODE NLST NOOP PASS

PASV PORT PWD QUIT REIN

REST RETR RMD RNFR RNTO

SITE SIZE SMNT STAT STOR

STOU STRU SYST TYPE USER

XCUP XCWD XMKD XPWD XRMD

ftp> open www.miservidor.comConnected to www.miservidor.com.220 Microsoft FTP Service

331 Anonymous access allowed, send identity (e-mail name) as password.

230 Anonymous user logged in.

250 CWD command successful.ftp>

Fuente 3

ftp> literal USER Anonymous

ftp> literal pass [email protected]

ftp> literal CWD /ArchivosdeGuillermoPuertas

Tabla 2.Algunos valores delenumerado AddressFamily

Nombre Descripción

Appletalk Protocolo Appletallk

Banyan Protocolo Banyan

InterNetwork Protocolo IP versión 4.0

InterNetwork6 Protocolo IP versión 6.0

Tabla 3. 'Algunos valores delenumerado ProtocolType

Nombre Descripción

IP Protocolo de IP versión 4.0

IP6v6 Protocolo de IP versión 6.0

ND Protocolo de disco de red

Ipx Protocolo IPX

TCP Protocolo de control detransmisión

El método Resolve de la clase DNSse especializa en consultar al serviciode DNS la dirección IP de un nom-bre de dominio, mientras queAddressList retornará la primeradirección del sitio en cuestión. Comopodemos apreciar se cuenta con unaestructura especial para almacenardirecciones IP llamada IpAddress.Podría haberse optado por una varia-ble de texto para almacenar la direc-ción, pero como .NET Framework esmuy estricto y claro, se ha diseñadoun tipo específico para almacenar estetipo de datos. Bien… tenemos ahorala dirección IP, ¿qué más nos está fal-tando?. Afortunadamente ya estamoscasi listos para establecer la conexión.El término “casi listos” no es dema-siado feliz ya que implica que algunascosas permanecen pendientes y estoes cierto. En el próximo resolveremoslo que está pendiente mediante la ges-tión de puertos en .NET Framework.

Gestión de puertos en .NETFramework

Para poder acceder a un servidorse requiere un dato adicional que es elpuerto de acceso, esto es, el puntomediante el cual el servidor ofrece elservicio y, por supuesto, al cual conec-tarse. Por ejemplo, el servicio deHTTP emplea el puerto 80 mientrasque FTP el 20 y 21. Para esta prime-ra instancia haremos uso del puerto21 que es a través de donde se envíanlos comandos y se reciben las res-puestas. Una vez reunida toda estainformación (IP y puerto) podemosdecir que hemos constituido nuestra

llave de acceso o punto de entrada alservidor remoto.

puntodeEntradaIP = newIPEndPoint(dirección, 21);

La estructura IPEndPoint repre-senta justamente un valor de entradaclaramente definido, esto es, la direc-ción IP y puerto final al que deseamosconectarnos. Esta estructura es demucha importancia ya que una vezsuministrada esta información estare-mos en condiciones de conectarnos alservidor remoto.

this.socketCliente.Connect(puntodeEntradaIP);

Si todo sale bien habremos abier-to una conexión –o socket– con el puer-to FTP del servidor especificado, delo contrario obtendremos una excep-ción en tiempo de ejecución. Es ya elmomento de comenzar a utilizarcomandos y así interactuar con el ser-

vidor FTP, pero antes demos un vis-tazo a las posibles respuestas del ser-vidor (ver tabla 4).

Valores de respuesta del servi-dor FTP

Una vez abierta la conexión esnecesario verificar la respuesta del ser-vidor para saber si todo ha funciona-do correctamente. Para ello he cons-truido un procedimiento llamadoleerRespuesta que interactúa con laconexión (que es en realidad un socketabierto hacia el puerto 20 del servi-dor), y luego obtener el texto de res-puesta. El método Receive recibe lacadena de bytes y la carga en la varia-

ble búfer, así como en mensaje el tex-to completo. (fuente 4).

Socket también cuenta con un méto-do Send, del que hablaremos en brevecuando queramos enviar comandos alservidor.

Toda respuesta contiene al comien-zo un código numérico de 3 dígitosque identifica el mensaje posterior-mente y una descripción que puedevariar de acuerdo al idioma del servi-dor FTP. La invocación al método

dotN

etM

anía

<<

16

dnm.comunicaciones<<

//Obtiene la cantidad de bytes //de la respuesta.this.bytes = socketCliente.Receive(

this.búfer, this.búfer.Length, 0 );

//Obtiene el mensaje.this.mensaje += ASCII.GetString(

this.búfer, 0, this.bytes );

//Carga otros valores de la respuesta....

Fuente 4

Tabla 4. Nota de tabla: Resumen decódigos de respuesta de FTP.

Código Valor

125 Conexión de datos abierta, comen-zando la transferencia.

150 Conexión de datos abierta.

202 Comando no implementado eneste servidor.

200 El comando enviado es correcto.

220 El servicio de FTP está dispo-nible

226 Cerrando la conexión de datos,la acción ha sido correcta.

230 El usuario se ha conectado exi-tosamente.

250 La acción sobre el archivo soli-citado finalizó correctamente.

331 Usuario correcto, necesita ingre-sar la contraseña.

350 La acción requiere más informa-ción.

425 No se puede abrir la conexión dedatos.

530No se puede establecer unasesión con el usuario/contraseñaespecificada

Hasta ahora solamente era posible utilizar FTP en .NETFramework haciendo uso de controles de terceros, pero

con un poco de audacia y algunos trucos se puede lograr lomismo empleando las clases nativas de la infraestructura

leerRespuesta carga el código retornado en unavariable global llamada códigoResultado que nosserá de mucha utilidad ya que nos permitirá con-sultar este valor para conocer el estado de la cone-xión o de cualquier otro comando enviado. Veamosentonces un ejemplo de esto en el fuente 5.

Invocaremos este método siempre que interac-tuemos con el servidor con el fin de conocer si elcódigo de respuesta ha sido el esperado. Como nor-ma, los códigos dentre 100 y 399 son positivos mien-tras que el resto son negativos. La tabla 4 muestraalgunos de los valores que utilizaremos.

Envío de comandos al servidor FTPAhora nos centraremos en enviar comandos al

servidor, como pueden ser el usuario y la contra-seña, para finalmente establecer una conexión deconfianza. Para ello es necesario emplear USER yPASS seguido de los respectivos valores (veáse latabla 1).

El envío de un comando es muy sencillo ya quese logra utilizando la conexión abierta, aunque envez de invocar el método Receive (recibir) de Socketse hace a través de Send (enviar). El fuente 6 mues-

tra cómo enviar los comandos y verificar que losresultados sean los esperados. Para que el listado seamás amigable he encapsulado el procedimiento deenvío de comandos dentro de una rutina llamadaenviarComando.

A este punto no es mala idea bajar el ejemplo delsitio de dotNetManía y probarlo o para depurar pasoa paso lo que hemos visto hasta el momento y así qui-tarnos alguna duda que haya quedado con respectoal funcionamiento.

Hemos logrado un objetivo interesante que radi-ca en conectarnos a un servidor FTP e interactuarcon el mismo mediante comandos, así como tam-bién leer la respuesta de cada uno de ellos. Esto gra-cias a que conocemos ya la utilidad de una conexión(socket) y los métodos que ofrece para el envío yrecepción.

Modo pasivo y activoSin duda, una de las facetas más importantes de

FTP es la posibilidad de enviar o recibir archivos.Como el espacio es tirano, he pensado brindar eneste artículo solamente una de las dos opciones, aun-que en dotNetManía encontrará el ejemplo com-pleto con ambas implementaciones.

Si recuerda, al comienzo de este artículo habla-mos del funcionamiento de FTP y que empleabados conexiones a través de puertos diferentes, lasque cumplían distintos roles: una se encargaba delenvío de comandos y recepción de respuestas (puer-to 21); y la otra del envío y acogida de datos (puer-to 20). Esto es muy sencillo, pero sin embargo, exis-te una trampa en todo esto que se debe tener encuenta antes de realizar la implementación del méto-do para enviar un archivo.

Cuando la aplicación .NET Framework avisamediante un comando al servidor FTP que se subi-rá/bajará un archivo, entonces este último se conecta-rá al puerto que utilizó el cliente para enviar el coman-do más uno y comenzará a emplear este canal para reci-bir o enviar datos. Véase la figura 3.

Esta aproximación se denomina Modo Activo yfunciona correctamente dentro de una intranet,

dotN

etM

anía

<<

17

dnm.comunicaciones<<

this.leerRespuesta();

//Si el resultado es <> 220 entonces es un error!!!if(this.códigoResultado != 220){//¡Hubo un error! Hacer algo aquí...

}

Fuente 5

//Envía comando de usuario y el nombre de usuario.

//¿Son los valores esperados?if( !(this.códigoResultado == 331 || this.códigoResultado == 230) ){

//No son los valores esperados, hacer algo.}

//Si no es 230 continúa.if( this.códigoResultado != 230 ){

//Envía comando de contraseña y el valor de la misma.

//Verifica nuevamente código de respuesta.if( !(this.códigoResultado == 230 || this.códigoResultado == 202) ){

//No son los valores esperados, hacer algo.}

}

Fuente 6

this.enviarComando("USER " + usuario );

this.enviarComando( "PASS " + contraseña );

Figura 3. Modo Activo de FTP

pero cuando esta tarea se está llevan-do acabo a través de Internet, puedeno tenerse un resultado exitoso. Estoes debido a que la mayor parte de loscomputadores cuentan con un corta-fuegos que no permite que agentesexternos abran una conexión a nues-tro computador. Para que esto nosuceda, se cuenta con otra alternativallamada Modo Pasivo que implica queuna vez que el cliente envía el coman-do indicando que se subirá/bajará unarchivo, el servidor responderá elnúmero de puerto al que la aplicacióncliente se tendrá que conectar ycomenzar a escuchar o a enviar datos.Este puerto no será el 20 sino que seelegirá uno al azar. La figura 4 mues-tra gráficamente el funcionamiento deeste modo.

De esta forma es siempre el clien-te el que administra la apertura o cie-rre de puertos en sí mismo, y no unagente externo como es el servidor.He optado entonces por esta segundaalternativa ya que creo será más sanay funcionará en todos los contextos.Por supuesto que si el servidor tieneun cortafuegos se tendrá que dejarsiempre un rango de puertos que seanfactibles de conectar desde el mundoexterior.

Para configurar el Modo Pasivo bas-ta con enviar el comando PASV al ser-vidor.

//Configura el modo pasivo.this.enviarComando("PASV");

Una vez enviado este comando, elservidor enviará en el texto de res-puesta la dirección IP y el puerto alque nos tendremos que conectar. Enla próxima y última sección nos

encargaremos de abrir la nueva cone-xión que utilizaremos para datos, olo que es igual, para el envío delarchivo.

Subiendo un archivo al servi-dor FTP

Ya hemos visto la mayor parte de laimplementación de un cliente FTP, aho-ra nos queda tan sólo un punto más, elque radica en enlazarse al puerto dedatos para así finalmente enviar desdeel cliente el archivo deseado. Esto afor-tunadamente se hace de igual forma quela conexión que abrimos inicialmente,salvo que utilizando otra informaciónde puerto. El fuente 7 muestra comohacerlo.

Ya estamos listos para enviar elarchivo al servidor ya que nos hemosconectado en forma exitosa, ahora fal-ta avisarle de lo que haremos con elcanal. Para ello debemos utilizar elcomando STOR –acrónimo de Store(almacenar)– para especificar que secomenzará el envío de un archivo através del canal abierto.

//Comienza el envío del archivo.this.enviarComando( "STOR " +

Path.GetFileName(nombredeArchivo) );

El próximo y último paso radicaen abrir un stream para la lectura delarchivo y al mismo tiempo enviar loleído mediante el método Send del soc-ket. Esta tarea simple, pero efectiva,hará una copia del archivo del clienteen el servidor; el fuente 8 muestra laimplementación de la rutina que lle-va adelante la tarea.

ConclusiónHemos concluido la implementa-

ción del cliente FTP en .NETFramework, espero que haya sido unejemplo claro de cómo utilizar las cla-

ses de la infraestructura para gestionarconexiones de red, así como tambiénsea de utilidad para incluir en sus apli-caciones. Como siempre es un placerrecibir sus comentarios a través de micorreo electrónico [email protected]. Me despido hasta el próximomes y no olvide bajar el ejemplo delsitio de dotNetManía.

dotN

etM

anía

<<

18

dnm.comunicaciones<<

//Socket y punto de entrada de datos para el archivo.socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

puntodeEntradaIP = new IPEndPoint(Dns.Resolve(DirecciónIP).AddressList[0], puerto);

//Se conecta al nuevo punto de entrada indicado por el servidor.socket.Connect(puntodeEntradaIP);

Fuente 7

// Abre un stream para leer le archivo.FileStream input = new FileStream(nombredeArchivo,FileMode.Open);

//Se continúa leyendo el archivo hasta el finalwhile ((bytes = input.Read(búfer,0,búfer.Length)) > 0)

{//Envía por el socket de datoslos bytes leídos.cSocket.Send(búfer, bytes, 0);

}

//Cierra el socket de salida.cSocket.Close();

Fuente 8

Figura 4. Modo Pasivo de FTP.

Creación y uso de servicios Web desdeentornos tradicionales

Con tanto bullicio generado alrededor de los servicios Web parece que los pro-gramadores de toda la vida (sí, los que usan COM y/o lenguajes de Script, porejemplo) se han quedado fuera de la nueva onda. Sin embargo .NET ofrece solu-ciones para todo el mundo, incluso para aquellos que no saben nada de .NET.En este artículo veremos cómo dar el salto al mundo de los servicios Web des-de lenguajes tradicionales como Visual Basic 6.0, usando de manera indirecta.NET pero sin tener que aprender nada nuevo.

dotN

etM

anía

<<

19

<< apareció en escena lo que más se oía por aquelentonces en el sector era la expresión “servicio Web”.Todo el mundo se apuntaba a este nuevo conceptode moda y todos los lenguajes y plataformas incor-poraban funcionalidades nativas para la creación yel consumo de componentes a través del protocoloSOAP. En ese contexto parecía que los programa-dores de entornos de Microsoft más tradicionales(como Visual Basic 6.0 o ASP) se quedaban total-mente fuera de juego, condenados a la ignominiadebido a la obsolescencia de sus herramientas.

Bien es cierto que Microsoft puso a disposiciónde estos programadores un kit de desarrollo SOAPpensado para entornos COM tradicionales, el SOAPToolkit. Sin embargo se trataba de un producto exter-no al lenguaje, que requería una instalación propia,que ofrecía severas incompatibilidades entre sus dife-rentes versiones y que además no era fácil de apren-der. Está muy bien para diseñar servicios avanzadosdesde cero, pero requiere un esfuerzo importantedominarlo, y es muy poco operativo para usos sen-cillos. La última versión de éste, la 3.0, se puede des-cargar gratuitamente desde el centro de descargasde Microsoft (www.microsoft.com/downloads).

Lo que a todos nos gustaría es una ruta de actua-lización directa y sencilla que nos permitiese creary consumir servicios Web sin tener que esforzarnosdemasiado ¿verdad?

La plataforma .NET de manera indirecta nosofrece esta opción como enseguida comprobaremos.

Más que crear nuevas aplicaciones basadas en ser-vicios Web con Visual Basic 6.0 (en ese caso reco-

miendo pasarse a .NET cuanto antes), las técnicas queveremos están orientadas a permitirnos reutilizar comoservicios Web ciertos componentes COM preexisten-tes, recuperando la inversión hecha en ellos y dándo-le una vida más allá de su uso tradicional.

Primer ejemplo:un servicio Web simplecon Visual Basic 6.0

Como ejemplo inicial vamos a crear un servicioWeb con Visual Basic 6.0 que nos permitirá servirla hora a diversos clientes que se mantendrán sin-cronizados a través de él. Puede descargar este ejem-plo y todos los demás mencionados en el artículodesde la Web de dotNetManía.

Abra el entorno de Visual Basic 6.0 y cree unnuevo proyecto de tipo DLL ActiveX. En las pro-piedades del proyecto otórguele el nombrePruebaSOAP y marque las opciones “ejecución desa-tendida” y “conservado en memoria” (figura 1).

A la clase que se crea por defecto cámbiele elnombre y llámele Hora. Añádale un métodoHoraLocal, que será el que expondremos, usando elsiguiente código:

Public Function HoraLocal() As StringHoraLocal = Format(Time, "h:m:s")

End Function

Más sencillo imposible. Ahora sólo hay que com-pilar el proyecto y obtendremos una DLL COMque expondrá la clase recién creada y la registraráen el sistema.

Cuando .NET

José M.Alarcón

dnm.asp.net

José Manuel Alarcón es redactor de dotNetManía.

Es ingeniero industrial yespecialista en consultoría de

empresa.Ha escrito varios libros,y ha publicado más de

doscientos artículos sobreinformática e ingeniería en

revistas especializadas.Visita sublog en www.jasoft.org.

Hasta aquí todo normal. No hayproblema alguno para usar la claserecién creada a través de COM oDCOM desde otro proyecto de VisualBasic, un script o una página ASP.

Para exponer el componente comoservicio Web no hace falta tampoco grancosa. Debemos tener, eso sí, instaladoInternet Information Server en el equipo conWindows XP o Windows 2003 Server, yaque SOAP es un protocolo basado enHTTP. Asegúrese de que tiene IIS insta-lado y funcionando antes de continuar.

En las herramientas administrati-vas ejecute la consola de administra-ción de servicios de componentes (osea, COM+, vea la figura 2). Dentro

del nodo “Aplicaciones COM+” creeuna nueva aplicación y agréguele laDLL que acaba de compilar. En laspropiedades de la nueva aplicaciónCOM+ vaya a la pestaña “Activación”y marque la opción “Usa SOAP”. Enel campo de texto inferior escriba el

nombre que quiera otorgarle al direc-torio de IIS en el que se publicará suservicio Web, por ejemplo, HoraWS,como en la figura 3.

¡Ya está! Aunque parezca increíble des-de este momento disponemos de un nue-vo servicio Web en el equipo que estará

sirviendo los métodos del objeto COMque creamos hace un momento.

Para comprobarlo abra su navega-dor favorito (incluso desde otro equipo,por supuesto), y escriba:

http://nombre_servidor/HoraWS/

Al hacerlo verá cómo aparece unapágina Web que contiene un enlace alarchivo de descripción (WSDL) delnuevo servicio Web. Este WSDL con-tiene una descripción estándar de lascapacidades del servicio Web de for-ma que cualquier cliente que necesi-te utilizarlo sepa cómo hacerlo.Pulsando el enlace anterior puede versu contenido.

Puede probar a consumirlo desdeuna aplicación .NET agregando de lamanera habitual una referencia Web yverá cómo funciona perfectamente.

dotN

etM

anía

<<

20

dnm.asp.net<<

Figura 2.Desde la consola de administración de COM+ podemos crear nuevasaplicaciones. Podemos utilizarlas para exportar los objetos COM mediante SOAP.

Figura 3. En la pestaña Activación podemos decidir que los objetos COM que formanparte de la aplicación COM+ se expongan como un servicio Web.

Figura 1. Para el ejemplo compilaremosuna biblioteca COM escrita en VB6 que

servirá de servicio horario que seconsumirá a través de SOAP.

dotN

etM

anía

<<

21

dnm.asp.net<<

¿Qué ha pasado aquí?

La verdad es que ha resultado muyfácil. Pero, ¿cómo lo hemos conseguido?,¿qué tiene que ver .NET con todo esto?

Lo que ha ocurrido entre bambalinases que de forma automática se ha creadoun ensamblado .NET que envuelve anuestro objeto COM y expone su fun-cionalidad usando .NET Remoting. Esdecir, se ha creado una aplicación .NETpero sin que fuera necesario por nuestraparte tener conocimiento alguno de estaplataforma. El ensamblado está configu-rado para responder a las peticiones a tra-vés del puerto 80, usando HTTP y SOAP,es decir, es un servicio Web con todas lasde la ley.

Puede encontrar el ensamblado encuestión dentro de la carpetaC:\Windows\System32\Com\SOAPVRoots\Ho

raWS. Dentro de ésta encontrará unapágina Web por defecto para el servi-cio, el archivo Web.Config que controlasu comportamiento y dentro de la sub-carpeta bin una ensamblado .NET quecontiene el objeto expuesto como ser-vicio Web. Podemos abrir este ensam-blado con un decompilador de código.NET y veremos que la implementaciónes muy sencilla, limitándose a crear unenvoltorio .NET sobre el objeto COMque le hemos asociado (figura 4).

Dado que se trata de un objeto.NET Remoting, se puede modificar sucomportamiento jugando con los pará-metros de Web.config, pero los valorespor defecto que trae serán los más apro-piados en la mayoría de los casos.

Como vemos es muy fácil darle unanueva vida a nuestro código heredadoconvirtiéndolo en un servicio Web gra-cias a la magia de .NET. En cualquiercaso, y como veremos enseguida, toda-vía nos quedan algunas consideracionesque hacer al respecto. Mientras tanto…

Consumir servicios Web desdelenguajes tradicionales.

Además de crear de manera sencillaservicios Web también resulta funda-mental poder consumirlos desde len-guajes tradicionales, sin complicarnosla vida con técnicas complejas. Por for-tuna los chicos de Microsoft están entodo y lo han convertido en algo muy

sencillo también, aunque con algunaslimitaciones.

Como ejemplo vamos a consumirel servicio Web que acabamos de cre-ar desde un pequeño script de WSHescrito en VBScript. Sólo tiene queguardar el código con extensión .VBS(o incluso usarlo desde una páginaHTML) y podrá ejecutarlo haciéndo-le doble clic encima.

La técnica de acceso al servicioWeb consiste en usar de una maneraun tanto especial la conocida funciónGetObject. Ésta se encuentra disponi-ble en cualquier lenguaje capaz deautomatizar objetos COM: VisualBasic, lenguajes de Script, Office,etc… por lo que su uso es casi uni-versal.

Por ejemplo, el siguiente código uti-liza nuestro servicio Web de informa-ción horaria para mostrar en un cuadrode diálogo la hora del servidor:

Dim oHoraset oHora = GetObject("soap:wsdl=”&_

“http://localhost/horaws/” &_“PruebaSOAP.Hora.soap?WSDL")

msgbox oHora.HoraLocal

Como podemos comprobar nada mássencillo. Basta con colocar la URL del des-criptor del servicio Web (el archivo WSDLque mencioné antes) como parámetro deGetObject, precediéndolo con la expresión“soap:wsdl”. Se creará automáticamenteun objeto COM con los métodos expues-tos por el servicio Web que podremos usarcomo si fuera local, usando de maneratransparente el servicio Web.

Al igual que antes es .NET quienestá detrás de todo el proceso haciendoel trabajo sucio por nosotros. Se gene-ra de forma automática código .NETRemoting que se compila en un ensam-blado .NET que es el que hace se comu-nica con el servicio Web. Esta funcio-nalidad se expone a través de un envol-torio COM (un CCW o COM CallableWrapper) que puede ser utilizado desdecualquier cliente tradicional.

La primera vez que se hace una lla-mada al servicio Web, ésta tarda un parde segundos mientras se compila elcomponente. Todas las sucesivas llama-das, al existir ya el Proxy, se realizan agran rapidez y sólo dependeremos de lavelocidad de nuestra conexión.

Figura 4. La clase .NET Remoting generada es muy sencilla.Aunque no dispongamos delcódigo fuente es muy fácil obtenerlo usando un decompilador como .NET Reflector.

La DLL generada (y el archivo decódigo fuente a partir del cual se generó)la podemos encontrar en la carpetaC:\WINDOWS\system32\Com\SOAPAssembly,por lo que incluso la podremos utilizar talcual o recompilarla para usarla desde nues-tros desarrollos .NET también.

Por supuesto esta técnica permite elconsumo de servicios Web creados enotros lenguajes y tecnologías, no sólo loscreados con el método anterior. Así, si dis-ponemos de un servicio Web creado con.NET, Java, Gluecode o cualquier otrosistema compatible con SOAP, podemosconsumirlo a través de GetObject. Esto esasí en la mayor parte de las ocasiones, yaque existen ciertas limitaciones si el ser-vicio expuesto es muy complejo, aparte deque no funcionará si requiere el uso de lasextensiones para servicios Web (WSE,Web Service Enhancements).

Por ejemplo, el siguiente código, aná-logo al anterior, permite hacer uso de unservicio Web gratuito de XMethods, quecomprueba la disponibilidad de dominiosde Internet “.com”, “.net” y “.org”:

Este código le preguntará el nom-bre de un dominio (por ejemplo,JASoft.org) y devuelve la cadena“Available” o “Unavailable” en funciónde su disponibilidad. Si acude a la car-peta mencionada antes podrá ver tam-bién el código y la DLL generados para

actuar de intermediarios entre el scripty el servicio Web.

Reutilización de objetos conestado

Con las técnicas aprendidas hastaahora hemos creado y consumido obje-tos sin estado. Esto es, si disponemos deuna DLL escrita en VB que contieneuna clase que debe mantener informa-ción entre llamadas, no funcionarácorrectamente. Ello se debe a que cadallamada realizada a través de SOAP conla técnica descrita es independiente delas demás y se realiza sobre un objetodiferente en el servidor.

Ello supone un grave problema enmuchos casos, porque si bien en laactualidad se considera una buenapráctica de programación el uso deobjetos sin estado, en los tiempos deCOM esto era menos frecuente. Dehecho lo habitual era que los objetosguardaran el estado entre llamadas,por lo que, en la práctica, lo que

hemos visto para crear servicios Weba partir de objetos COM nos serviráen contadas ocasiones.

Vamos a crear un ejemplo quereproduzca este comportamiento y asíveremos cuál es la mejor forma de sol-ventar el problema planteado.

Consideremos la siguiente clase deVisual Basic 6 llamada PruebaSOAP2.Persona y que dispone de dos métodos:uno para anotar el nombre de una perso-na y otro para saludarla:

Private mNombre As String

Public Sub AnotaNombre(sNombre As String)mNombre = sNombre

End Sub

Public Function DimeNombre() As StringDimeNombre = mNombre

End Function

El método AnotaNombre almacenala cadena que se le pase como pará-metro en una variable privada de laclase. El método DimeNombre, por elcontrario, la recupera. Es obvio quepara que esta clase funcione como esdebido se debe poder realizar llama-das sucesivas sobre una misma instan-cia de ésta o el estado interno de lavariable mNombre se perdería.

Compile este código y expóngalocomo un servicio Web usando elmétodo visto antes. Vamos a probar aconsumirla mediante SOAP directa-mente tal y como hemos analizadohace un momento:

Dim oSet o=GetObject("soap:wsdl=http://localhost/personaws/PruebaSOAP2.Persona.soap?WSDL")

o.AnotaNombre "Jose"

MsgBox o.DimeNombre

En el mensaje final debería apare-cer la palabra “Jose”. Sin embargovemos que en realidad se muestra enblanco. Ello se debe a lo que comentá-bamos: cada llamada al servicio Web esatendida por un objeto diferente y nue-vo en el servidor. Está claro que estolimita bastante la capacidad de reutili-zar como servicios Web algunos com-ponentes heredados con estado.

Por suerte, como casi todo, estotambién tiene solución. Y es casi igualde fácil que todo lo visto hasta ahora.Lo primero que debemos hacer esexportar nuestra aplicación COM+ des-de la consola de administración de ser-vicios de componentes. Pulse con elbotón derecho sobre el nodo de la apli-cación COM+ y escoja la opción

dotN

etM

anía

<<

22

dnm.asp.net<<

Lo que a todos nos gustaría es una ruta de actualización directa y sencilla que nos permitiese

crear y consumir servicios Web sin tener que esforzarnos demasiado ¿verdad?

Dim sDominiosDominio = InputBox("Dominio a verificar (sin 'www')", "Verificador de dominios")If sDominio <> "" ThenDim oDCset oDC = _GetObject("soap:wsdl=http://services.xmethods.net/soap/urn:xmethods-DomainChecker.wsdl")

MsgBox oDC.checkDomain(sDominio)End If

“Exportar”. En el diálogo que apareceseleccione la opción “Proxy de aplica-ción” y escoja una ruta en la que crearun paquete de instalación MSI, tal ycomo ilustra la figura 5.

Al terminar dispondrá de unpaquete de instalación que podrá uti-lizar en cualquier equipo conWindows XP o Windows 2003 Servery que lo que hará es instalar un obje-to que actúa de proxy con el servicioWeb que hemos exportado. Ejecútelo.Tenga en cuenta que para poder pro-barlo deberá instalar el proxy en otroequipo diferente al que contiene elservicio Web o sobrescribirá el regis-tro del objeto COM original inutili-zándolo. El objeto Proxy creadoencapsula el acceso al servicio Web enuna CCW (COM Callable Wrapper) quereplica la funcionalidad del objetoCOM original.

Una vez instalado en otro equipopodrá comenzar a utilizar el objeto conel siguiente código:

Dim oSet o = WScript.CreateObject(_

"PruebaSOAP2.Persona")

o.AnotaNombre "Jose"MsgBox o.DimeNombre

El código funcionará ahora perfec-tamente, devolviendo en el cuadro dediálogo el valor del nombre fijado en lallamada anterior, es decir, manteniendoel estado entre llamadas.

Pero… ¡Eh!, ¡un momento!, ¿qué esesto?. ¡No estoy utilizando SOAP!Tranquilo, todo tiene una explicación.En realidad sí está utilizando SOAP y lasllamadas se están realizando a través deHTTP al servidor en el que está insta-lando el componente original. La dife-rencia respecto a lo que hemos visto has-ta ahora es que estamos utilizando unProxy .NET Remoting generado de for-ma automática por COM+ durante laexportación, y expuesto como un objetoCOM regular durante la importación.Es éste el que nos aisla de las compleji-dades de SOAP y nos permite utilizar elservicio Web remoto como si fuese uncomponente local. Para nuestro códigono habrá diferencia pero por detrás seestará haciendo uso de SOAP para rea-lizar las llamadas remotamente.

En la carpeta C:\WINDOWS\sys-tem32\Com\SOAPAssembly del sistema en

donde hayamos instalado el proxypodemos encontrar el archivo .CON-FIG que controla su comportamien-to. El contenido de este archivo serásimilar al siguiente:

<configuration>

<system.runtime.remoting>

<application>

<client url=

"http://www.nuestroservidor.com/PersonaWS">

<activated type=

"PruebaSOAP2SoapLib.PersonaClass,

PruebaSOAP2SoapLib"/>

</client>

</application>

</system.runtime.remoting>

</configuration>

Si sabemos un poquito de .NETRemoting podemos modificarlo y aña-dirle nuevos nodos de configuraciónpara modificar el comportamiento delproxy.

En resumenEn este artículo hemos estudiado

las diversas formas en las que .NETnos puede ayudar a entrar en el mun-do de los servicios Web desde len-guajes tradicionales, y todo ello sinnecesidad de aprender a programar enla plataforma o de disponer de unalicencia de Visual Studio.

Hemos aprendido a crear serviciosWeb simples a partir de objetos COMexistentes y a consumir éstos y otrosservicios desde código de script o cual-quier lenguaje de automatización conel simple uso de una función. Al mis-mo tiempo hemos visto cómo funcio-na todo ello por debajo para com-prenderlo mejor.

Por fin hemos presentado un pro-blema común que tiene que ver con elmantenimiento de los estados de obje-tos COM y hemos aprendido una téc-nica adicional que nos permite salvar lasituación con el mínimo esfuerzo.

Esperamos que todo ello haya sidode utilidad a aquellos lectores que toda-vía no han podido meterse a fondo con.NET o que, simplemente, disponen demultitud de código heredado que dese-an aprovechar de manera sencilla en laera de SOAP.

dotN

etM

anía

<<

23

dnm.asp.net<<

Figura 5.Al generar un Proxy para el servicio Web que se exporta en formato MSIpodemos instalarlo en cualquier equipo y acceder vía SOAP al

objeto original de manera sencilla y transparente.

Las tecnologías actuales

El término P2P de sus siglas eninglés Peer to Peer, se usa para denomi-nar la comunicación entre dos puntosterminales cuando la comunicación per-manece abierta y están fluyendo datosa través de ella.

Una conexión HTTP no es de tipoP2P, pues se basa en pedidos y res-puestas [1]. PON se basa en conexio-nes P2P. Cuando se accede a un servi-dor mediante conexión socks (TELNET,SSH, etc.), el tipo de conexión que seestablece en dicho momento es P2P. Sehan programado decenas de aplicacio-nes para compartir e intercambiar infor-mación entre PCs utilizando este tipode conexiones. Por supuesto que nosiempre se puede acceder directamen-te a otros PCs utilizando este tipo deconexiones. Si su PC está detrás de uncortafuegos1 es posible que no puedaabrir este tipo de conexiones.

Con independencia de las múltiplescríticas de seguridad hechas a este tipode conexiones, lo cierto es que el núme-ro de usuarios que gusta de utilizar soft-ware de intercambio P2P ha crecidoconsiderablemente. Esto se debe al granvolumen de información disponiblecuando se tiene acceso a lo que tienencada uno de los que participan y a lasencillez del intercambio.

Muchos usuarios prefieren usardichas aplicaciones para buscar la infor-mación que desean descargar en lugarde navegar en la Web en busca de lainformación y luego ver desde dóndepueden descargarla.

Napster fue el precursor del uso deesta tecnología, brindando una mane-

PON : P2P Over .NETUna plataforma para redes punto a punto basada en .NET

Millones de personas conectadas a la red de redes utilizanprogramas para compartir información.Aplicaciones comoKazaa, eMule y BearShare permiten a sus clientes formargigantescas comunidades virtuales. En este artículo se enu-meran algunas debilidades de estas tecnologías de inter-cambio Punto a Punto (P2P), entre ellas la de no operarentre sí.

El artículo presenta a PON (Peer to peer Over .NET): una pla-taforma implementada sobre la tecnología .NET, la cual per-mite el desarrollo de comunidades de nodos .NET. Con estaplataforma se da la posibilidad de conectar aplicaciones dife-rentes formando redes de intercambio aún más universales.

Además de que, cómo en cualquier aplicación, PON aprove-cha las bondades de .NET para acortar el proceso de desa-rrollo,PON se sustenta en el uso de importantes capacidadesexistentes en .NET como su carácter multiplataforma, y suscapacidades de Reflexión (facilita inspeccionar lo recibido),Serialización (facilita convertir la información al enviarla y al reci-birla) y Nombrado Fuerte (nos permite dar y tener seguridaden lo que se envía y en lo que se recibe).

La plataforma no requiere de la existencia de servidores parasu funcionamiento ya que se apoya en la cooperación de nodosque decidan colaborar en el intercambio.

1 Cortafuegos: Del inglés Firewall. Mecanismo de seguridad para Intranets que entre otras actividades restringe las conexiones entrantes.

<<

Leonardo Paneque Miguel Katrib

ra sencilla para que usuarios de todo elmundo compartieran música. Esto porsupuesto tuvo problemas legales con lascompañías discográficas, pero la ideasirvió de transición a otras aplicacionescomo Gnutella, Kazaa [2-3], eMule [4-6] y muchísimas otras, que ya no sólo secentran en el intercambio de música sinode cualquier información que el clien-te desee compartir con el mundo2.

LPhant es una aplicación desarro-llada recientemente sobre .NET sobrela que se publicó en un número ante-rior de dotNetManía [7]. Aunque elartículo presenta a LPhant como elprimer P2P sobre .NET, lo cierto esque parece ser un cliente más para lared eDonkey/eMule. Existen decenas,sino cientos, de versiones clientes deeMule tanto para Java como para.NET (y también versiones clientespara Kazaa, bitTorrent y otros) queprogramadores hacen a diario porencargo a consumidores en todoInternet3. De modo que tal vez no seaexacto el autor cuando dice queLPhant es el primer Peer to Peer sobre.NET. LPhant está desarrollado en.NET, pero se basa en consumir yenviar paquetes (o sea usar el proto-colo) de eMule. Digamos entonces quees una suerte de envoltura de eMuleprogramado en .NET. Claro está,como mismo indica el autor del artí-culo, que es una propuesta interesan-

te porque muestra las bondades de.NET en comparación con tecnolo-gías nativas sobre C++ o C y le

demuestra a los tradicionalistas delC++ que no sólo es fac-tible, sino mucho más

fácil, desarrollar estetipo de aplicacionesen C# y .NET.

Lo que ocurrecon PON es que es

una plataforma como talprogramada en .NET y destinada aque sobre la misma se puedan montardisímiles aplicaciones P2P, que pue-dan incluso interoperar entre sí. Siusted quiere participar en la red yhacer de su PC un nodo de esta comu-nidad, lo único que debe es tener ins-talado el .NET Framework4 y ejecu-tar la plataforma. Cada cliente debecentrarse solamente en programar suaplicación utilizando PON5, que brin-da un conjunto de facilidades progra-máticas basadas en .NET para el tra-bajo con redes. Su aplicación estarálista entonces para conectarse conotras aplicaciones que estén desarro-lladas también sobre PON y ayudar-se en la comunicación de nodos que,aunque no estén ejecutando ningunaaplicación, hayan decidido colaborarinstalando y ejecutando PON.

Los mensajes que PON envía por lared no son simples paquetes de bytescomo en otros productos sino que sonobjetos (y como tales incluyen datos yfuncionalidad ejecutable).

Problemas de las redes P2Pactuales

No se entienden entre sí

Desde la aparición de Napster, hansurgido múltiples redes dirigidas al mis-mo objetivo de intercambiar informa-

ción. Pero esto ha devenido en redesseparadas que no tienen ninguna posi-bilidad de intercambiar información conusuarios de otra diferente.

Se entiende por red en este caso alos nodos conectados usando una apli-cación. Por ejemplo, los servidores deKazaa y sus clientes que estén on linedefinen la red de nodos de Kazaa. Asícomo los servidores de búsqueda deeMule y sus clientes definen la red denodos de eMule. Dado que Kazaa yeMule utilizan protocolos distintos, esimposible que nodos de estas redes com-partan la misma información (figura 1).Para hacerlo tendríamos que tenerambas aplicaciones ejecutándose en elmismo ordenador. Algo parecido suce-de a diario con los programas de chat;quien está en MSN Messenger no seentiende con quien esté en YahooMessenger y viceversa debido a que losservidores y aplicaciones de Yahoo yMSN no se entienden porque usan pro-tocolos diferentes.

dotN

etM

anía

<<

25

dnm.comunicaciones

Figura 1. Redes disjuntas

2 Otro asunto es si el poseedor de la información tiene derecho legal para tenerla o compartirla; pero ese no es el tema del presente trabajo quese dedica solo a los aspectos tecnológicos que hacen posible el intercambio.

3 Ver por ejemplo el sitio www.rentacoder.com4 Disponible en http://www.microsoft.com/downloads/details.aspx?FamilyID=262d25e3-f589-4842-8157-034d1e7cf3a3&displaylang=en5 Una DLL de no más de 35 KB

dotN

etM

anía

<<

26

dnm.comunicaciones<<

Si todos estamos en la mismaInternet (vale decir tenemos la mismaatmósfera) porqué no intercambiarinformación sobre una misma platafor-ma de intercambio P2P (figura 2).

Con las tecnologías actuales esto noes posible debido a que los protocolosutilizados han sido creados pensando encada aplicación en específico y no en laposibilidad de extender la variedad deaplicaciones conectadas entre sí. Peroesto puede mejorarse aprovechando elcarácter cada vez más multiplataformade .NET donde un nodo podrá ser, porejemplo, un PC Windows, un PC Linuxo un dispositivo móvil.

En PON para convertirse en unnodo de la comunidad basta con crearuna instancia de la clase PONKernel.

Conexiones forzadas

En este tipo de conexión si se deseadescargar un archivo hay que conectar-se directamente al PC en el que seencuentra éste. Háyase hecho la bús-queda por mediación de un servidor debúsqueda o no, la forma de descargar lainformación deseada es forzando a losparticipantes a conectarse entre sí. Ungran inconveniente para esto es quemuchos clientes pueden estar detrás deun cortafuegos. En tal caso, si la políti-ca de seguridad lo permite, los clientespodrán abrir conexiones hacia fuera desu red pero nadie podrá abrir una cone-xión hacia él.

Cada usuario que desee sumarse alnúmero de clientes de una determina-da red debe tener acceso socks a Internetdesde su PC, lo cual también es un ries-go informático. Supongamos, por ejem-plo, que en una universidad o bibliote-ca todas las máquinas tienen acceso ili-mitado a Internet, donde el acceso ili-mitado sería la posibilidad de abrir cone-xiones P2P a cualquier PC en Internet.El flujo de datos podría ser entoncesincontrolable y el peligro de ataqueshacia la red crecería considerablemen-te. De modo que es necesario crear dealgún modo un mecanismo para queusuarios de una intranet puedan utili-zar servicios de intercambio sin queafecten el funcionamiento de la redcompleta. De este modo en un escena-

rio como el de la biblioteca no será nece-sario darle permisos completos de sali-da directa hacia Internet a todas lasmáquinas de una biblioteca, sólo los per-misos necesarios para que se puedanavegar (HTTP) desde estas máquinas.

Además de las dos limitaciones ante-riores se pueden mencionar otras difi-cultades en las redes P2P actuales:

•Ausencia de reconexión automática. Porlo general los programas clientes deestas redes no son lo suficientemen-te tolerantes a fallos. Cuando se caenconexiones en la red, simplementese deja de buscar o intercambiararchivos con los puntos perdidos. Enel caso de los que usan servidores espeor, pues la estabilidad y velocidadde los servidores puede comprome-ter la estabilidad y velocidad del ser-vicio en toda la red.

•División de la red. Al caerse algunospuntos se forman subredes no cone-

xas entre sí, lo cual disminuye eltamaño de la red a la cual tiene acce-so un usuario. Estas componentesconexas producto de desconexionesy otras anomalías son llamadasHorizons.

•Protocolos muy específicos. La mayo-ría de las aplicaciones están pre-paradas sólo para comunicarseentre clientes que ejecuten la mis-ma aplicación.

•Poca o ninguna extensibilidad. Si ala debilidad anterior se añade elque muchas de estas aplicacionesde intercambio han sido progra-madas en lenguajes nativos, se tie-nen como resultados herramien-tas muy difíciles de extender omodificar.

Qué es PON

Una red PON es simplemente unconjunto de nodos formando un grafoque disponen del .NET Framework yque han decidido ejecutar PON. Esdecir, PON es la plataforma soporte ylas aplicaciones que se desarrollen sobrePON y que utilicen estos nodos son lasresponsables de brindar distintas fun-cionalidades. PON es el sustrato dedesarrollo y funcionamiento que ade-más les facilita interoperar entre sí.

PON se encarga de modo transpa-rente de hacer la comunicación, y estose logra sin detrimento de otras funcio-nalidades porque al ejecutar PON suaplicación decide qué velocidad detransmisión está dispuesta a ofrecer asus vecinos.

Crear un nodo PON consiste en eje-cutar una aplicación que cree una ins-tancia de la clase PONKernel, del names-

PON se encarga de modo transparente de hacer la comunicación, y esto se logra sin detrimento de otras funcionalidades porque al ejecutar PON

su aplicación decide qué velocidad de transmisión está dispuesta a ofrecer a sus vecinos

Figura 2.Varias redes de aplicacionesdistintas conectadas entre sí

Figura 3. Limitante del cortafuegos

dotN

etM

anía

<<

27

dnm.comunicaciones<<

pace PONFramework. Mientras su aplica-ción esté activa, su nodo PON le esta-rá brindando su cooperación a usted ya sus vecinos.

PONKernel kernel = new

PONKernel(KernelConfig,"Juan");

Donde KernelConfig es una instan-cia de la clase PONKernelConfiguration,la cual provee al núcleo de PON coninformación necesaria para instanciar-se y funcionar correctamente. Elsegundo parámetro es un alias (nom-bre que usted le quiere asociar al nodo).PON no utiliza los alias para diferen-ciar a los nodos en la red ya que los aliasno son únicos y están destinados sóloa brindar información consumible porun ser humano. En cambio utilizaGUIDs6 para identificar a los nodos;estos GUIDs son solamente de lectu-ra para el usuario y son trabajadosinternamente por PON.

La clase de configuración tiene lainterfaz del fuente 1.

Una vez creada la instancia se debellamar al método PONKernel.Start()para que el nodo esté listo.

Mensajes en PONUn mensaje para PON no es más

que un objeto .NET serializado en bina-rio. Con ello, gracias a la característicamultiplataforma de .NET (un emisor,un trasmisor y un receptor pueden estaren diferentes plataformas pero todas con.NET), se evita el problema de los pro-tocolos hard-coded que utilizan las tec-nologías P2P actuales.

Con el objetivo de hacer posible lainterconexión entre diversas aplica-ciones desarrolladas y ejecutandosobre la red de nodos PON, se llevana cabo un conjunto de operacionessobre estos mensajes para garantizarque lleguen al destino correcto. Porcorrecto no sólo se entiende que lle-gue al destino deseado, sino ademásque dicho destino sea capaz de “enten-der” el mensaje.

Los mensajes son divididos en dostipos. Los propios de PON, y los quepersonalizadamente implemente cadaaplicación que utilice PON.

Los mensajes PON son instanciasde la clase PONMessage contenida en elnamespace CommonPONMessages y estádada por la interfaz del fuente 2.

Donde MsgTypes está definido por elenumerativo del fuente 3.

En las secciones a continuación seexplican los principios que usa PONpara la transmisión, entrega y filtradode estos mensajes.

Transmisión

Se entiende por transmitir unmensaje a serializar un objeto que sedesea transmitir dentro de un mensa-je de PON, y enviarlo. La estructurade un mensaje de PON es la de la figu-ra 4.

El array contenido dentro delmensaje PON es la información quela aplicación cliente quiere transmitir.La forma de poner el mensaje delcliente dentro del mensaje PON es através del método SetContent(object)de la clase PONMessage, el objeto pasa-do como parámetro debe ser seriali-zable o lanzará una excepción de tipoArgumentException. Se entiende porcliente de PON a una aplicación queutiliza la plataforma como base parasus conexiones.

De esta forma la aplicación clien-te utiliza PON para enviar sus men-

[Serializable]public class PONKernelConfiguration {

public int ListenningPort{...}public bool IsHost{...}public int MaxIncomingConnections{...}public ArrayList BannedIPList{...}public ArrayList IPList{...}

}

Fuente 1

[Serializable]public class PONMessage {

public PONMessage(){...}

public PONUser Target{...}public ArrayList Path{...}public MsgTypes MsgKind{...}public PONUser Sender{...}public string UniqueID{...}public string GUID{...}public Stream Content{...}public object GetContent(){...}public void SetContent(object obj){...}

public int Cursor;}

Fuente 2

[Serializable]public enum MsgTypes {

BroadCastMessage,Personal,Lost,NewAdjacent,AdjacentDown

}

Fuente 3

Figura 4. Mensaje PON. Estructura

Figura 5. Procesos para enviar un mensaje

6 GUID (Global Unique IDentifier) es un valor de identificación, que por su forma de generarse se garantiza que sea único.

dotN

etM

anía

<<

28

dnm.comunicaciones<<

sajes, los cuales consisten en objetosserializados a otros clientes de PONcapaz de entender estos mensajes, locual se realiza a través del filtrado deéstos. Puesto que son objetos seriali-zados, sólo quienes tengan los ensam-blados donde están definidos los tiposde los objetos que se envían podránentender los mensajes.

Filtrado

La entrega de un mensaje a un clien-te de PON se realiza si se cumplen lasdos condiciones siguientes:1. El mensaje va destinado a un clien-

te especifico (MsgTypes.Personal) obien está destinado a todos los clien-tes de la red (MsgTypes.BroadCastMessage).

2. El cliente especificó explícitamenteque es capaz de entender este tipode mensajes y que desea recibirlo(filtrado).Para que se cumpla la segunda

condición el cliente debe especificarque quiere “consumir” los mensajesde este tipo que cumplan con la pri-mera condición. Para ello el clientedebe de tener el ensamblado en el cualestán contenidos los tipos de los obje-tos que desea recibir. Esto se logra conel método kernel.CManager.Add

MessageFilter(Type)

Ejemplo:Supongamos que tenemos sobre

PON una aplicación para chat queconsta de tres tipos de mensajes:UserSearchMsg, UserSearchResultMsg yTextMessage.

Se le diría entonces a PON que sequiere procesar estos tipos de la formaque vemos en el fuente 4.

Donde kernel es una instancia de laclase PONKernel, la cual define un nodoPON en sí.

PON en cada nodo verifica si el tipodel objeto que pasa por él puede serentendido, lo que se traduce en que este

nodo puede deserializar los objetos con-tenidos en los mensajes. Para ello esnecesario que cada aplicación en el nodoque quiera interceptar mensajes le espe-cifique a PON qué tipos puede enten-der. Así cuando un mensaje llega a unnodo PON, éste se lo pasa asincrónica-mente a un manejador. Este manejadorverifica si su tipo es de alguno de los fil-tros (tipo .NET con nombrado fuerte)indicados por la aplicación que estáusando a dicho nodo; en tal caso se lopasa a la aplicación, mientras el nodoPON pasa a su vez el mensaje a otrosnodos y continua con la recepción yenvío de mensajes (figura 6).

En la información del mensaje seenvía el nombre del tipo del objetoque viene serializado en el mensaje.Por ello cuando se crea un mensaje(PONMessage), PON antes de serializarguarda el nombre completo del tipo yluego serializa en binario el objeto(usando el mecanismo de serializaciónde .NET).

La utilización de .NET permitevalernos del recurso del nombrado fuer-te (strong naming) para facilitar la dife-

renciación de los tipos y garantizar laseguridad si se desea, habiendo firma-do digitalmente el ensamblado. En otras

tecnologías esta diferenciación de si eltipo del objeto recibido es de los queestoy dispuesto a recibir, tendría quesustentarse en el uso de recursos comointerfaz que en definitiva no garantizanla unicidad y obligaría a añadir por sepa-rado los mecanismos de seguridad paralos casos en que se quiera privacidad.

El nombrado fuerte de un tipo A, noes sólo el nombre A como tal (incluyen-do el camino de namespaces en el que seencuentre), sino el nombre del ensam-blado, la versión, y la firma digital quepuede haberse utilizado a la hora de gene-rarlo (compilarlo). Un ejemplo sería:

CommonPONMessages.GBMessage,Version=1.0.1615.26757,Culture=neutral,PublicKeyToken=null

Ningún cliente no autorizado podráfirmar un ensamblado para intentar inter-ceptar mensajes que no le competen. Deeste modo se garantiza que sólo clientesque posean los ensamblados (DLLs) ten-gan acceso a determinados mensajes. Estopuede parecer innecesario para una sim-ple red P2P orientada a un mismo pro-pósito, pero sí es de utilidad para interco-nectar aplicaciones de intercambio de pro-pósitos diferentes.

Según el ejemplo anterior sóloserán atendidos por el nodo aquellosmensajes que sean de los tiposUserSearchMsg, UserSearchResultMsg yTextMessage. Aun cuando debido altráfico de la red pasen por este nodootros mensajes de diferentes tipos,sólo los que sean instancias de estos

kernel.CManager.AddMessageFilter(typeof(UserSearchMsg));kernel.CManager.AddMessageFilter(typeof(UserSearchResultMsg));kernel.CManager.AddMessageFilter(typeof(TextMessage));

Fuente 4

Figura 6. Procesamiento de un mensaje PON dentro de un Nodo PON

tres tipos serán entregados a la aplicación clientede PON que está ejecutando en ese nodo.

Una vez puestos estos filtros, el código de la apli-cación cliente será notificado de la llegada de infor-mación (mensajes) para él, mediante el evento:

public event OnMessageReceived EventMessageReceived;

El cual se encuentra en la clase PONKernel. Unejemplo de manejador para este evento sería el delfuente 5.

Auto-reconexión en PON

Un inconveniente en algunas redes P2P es lacantidad de subredes no conexas que se puedan for-mar fruto de la caída inesperada de una conexión.Para obviar este inconveniente, PON incorpora unmecanismo de reconexión que funciona sin necesi-dad de interacción con servidor alguno. Es decir,cada cliente o nodo es capaz de reparar por sí solola parte de la subred formada por sus nodos adya-centes y el nodo mismo. Ayuda a esto el mecanis-mo de excepciones y la recolección automática dememoria en .NET.

El termino “red” es usado aquí para referirnosa una red formada por aplicaciones, por ejemplo,una red formada por un grupo de jugadores en

Internet, una red formada por clientes de una vide-oconferencia, etc.

Supongamos la red que se muestra en la figura 7.

Supongamos entonces la caída del nodo marcadoen la figura 8; esto podría transformar la red y divi-dirla en varias subredes no conexas.

Esto es lo que ocurre en la mayoría de las tecno-logías existentes que dependen de servidores, y es muycomún en el caso particular de Gnutella. En el caso dePON al “caerse” un nodo, sus adyacentes tienen noti-cias mediante el envío de un mensaje de tipoAdjacentDown de que esto ha ocurrido e intentan esta-blecer conexiones entre ellos de manera inmediata.La figura 9 a continuación muestra una posible topo-logía para la nueva red luego de restaurarse la cone-xión, lo cual corre a cargo de PON. Sólo garantizaque la red quede conexa sin atarse a ningún modeloen específico para esto.

Al detectarse la caída de un nodo por medio delmecanismo de excepciones de .NET se invoca uno delos eventos:

dotN

etM

anía

<<

29

dnm.comunicaciones<<

public void OnMessage( PONChatClient client,PONMessage msg)

{try{object obj = msg.GetContentObject(); if (obj is UserSearchResultMsg) {WhenUserSearchResult((UserSearchResultMsg)obj,

msg);}else if (obj is UserSearchMsg) {WhenUserSearch((UserSearchMsg)obj, msg);

}else if (obj is TextMessage) {WhenTextMessage((TextMessage)obj, msg);

}}catch(Exception e){//handle the exception here}

}}

Fuente 5

Figura 7. Ejemplo de red con nodo crítico

Figura 8. Red dividida por la caída de un nodo crítico

Figura 9. Red PON reconstruida

public event OnConnection EventIncomingConnectionDown;public event OnConnection EventOutgoingConnectionDown;

Y a continuación se invoca el método de la cla-se PONKernel:

protected virtual void RestoreNetConectivity(PONChatClient client);

Este método recibe como información cuál fue elcliente que se desconectó de entre los adyacentes y,gracias a la información que almacena PON sobre losnodos y caminos que conoce hacia ciertos nodos, seprocede al intento de reconexión.

Interconexión de aplicaciones diferentesPON fue diseñado originalmente para interco-

nectar aplicaciones diferentes pero puede evolucio-nar hasta llegar a ser una plataforma para redes P2Pde uso general.

Una de las debilidades de otras tecnologías es quelas redes de intercambio basadas en softwares dife-rentes no podían conectarse entre sí. Pero si las redesde intercambio se sustentan en PON lo que viajarápor la red serán objetos .NET (cuyos tipos no pue-den ser corrompidos si tiene un nombrado fuerte).De este modo una nueva aplicación que se quiereincorporar, y aprovechar el contexto PON, le bastacon crear una instancia de PON y valerse de la redexistente para filtrar aquellos objetos que sean de suinterés.

Note que lo único que se exige es tener insta-lado el .NET Framework y desarrollar la aplica-ción utilizando PON (es decir agregando el ensam-blado PONFramework.DLL al proyecto y programar).No es necesario instalar ningún SDK ni ningún ser-vicio en el sistema.

De modo que si tenemos desarrolladas sobre PONlas siguientes aplicaciones, podemos tener el escena-rio que sigue (figura 10):

Donde los nodos pueden tener aplicaciones dife-rentes (tabla 1).

Note que el cliente de PON no tiene porqué cono-cer sobre la existencia de nodos de la red que usen sumisma aplicación. Basta con que se conecte a cual-quier nodo que utilice PON.

La operación de conectar dos nodos PON se pue-de hacer de forma explícita y directa invocando unade las sobrecargas siguientes:

public void StartClient(PONEndPoint endpoint);public void StartClient(string address, int port);

Donde PONEndPoint es:

[Serializable]public class PONEndPoint {

public string Address {get}public int Port {get }public PONEndPoint(string hostname,int port);

}

Pero también se puede hacer de forma global,actualizando el ArrayList IPList de la instancia de laclase PONKernelConfiguration que se le da en el cons-tructor a la instancia de PONKernel. Entonces al eje-cutarse el método PONKernel.Start() se abrirán cone-xiones a todos los nodos en esta lista.

Puesto que cada aplicación programada sobrePON tiene implementado su propio conjunto de men-sajes y su forma de manejar estos mensajes una vezque lo reciban, y dado que PON no permite que seentreguen mensajes de forma incorrecta o por error,entonces el escenario mostrado anteriormente fun-cionará de forma transparente al cliente.

Un escenario útil es poder crear aplicaciones híbri-das. Una de las limitaciones de los sistemas de chat actua-les como MSN, Yahoo, ICQ, e IRC es que no tienenforma de comunicarse entre ellos aun cuando todos tra-tan sobre el mismo tema. Lo que más se ha logrado (poralgunos grupos independientes o lobos solitarios) es hacerun ejecutable que los incorpore todos para mostrar unaventana por cada uno de ellos. Si estas aplicaciones hubie-sen estado desarrolladas sobre PON esto se podría hacercon facilidad porque todas las aplicaciones se puedenentender con el mismo sustrato.

dotN

etM

anía

<<

30

dnm.comunicaciones<<

Figura 10. Múltiplices aplicaciones sobre PON conectadas

Aplicación de mensajería instantánea (alestilo de MSN Messenger).

Aplicación para compartir imágenes decoleccionistas de sellos.

Aplicación para el intercambio de archi-vos (al estilo eMule).

Tabla 1

El enrutamiento de los mensajes

Los mensajes que transitan a travésde una red PON, pueden ser principal-mente de dos tipos: Broadcast y Personal.El primero es enviado desde un nodo alresto de la red, y el segundo va desde unnodo a otro. Una modificación intro-ducida por PON es que los mensajesviajan siguiendo el camino más rápidode un nodo a otro. PON se encarga deeste cálculo. Con esto se evita el pro-blema antes mencionado de las cone-xiones forzadas.

Broadcast

Los mensajes de este tipo son envia-dos a todos los nodos de la red. La apli-cación en el nodo fuente lo envía aPON, quien a su vez se lo da a todos susadyacentes y cada uno de ellos vuelve ahacer lo mismo, es decir, enviarlo atodos sus adyacentes. PON incorporaun mecanismo de identificación de men-sajes por GUID que evita el “eco” en lared porque evita que un mismo mensa-je sea procesado dos veces por un mis-mo nodo. El método para hacer broad-cast de un objeto search es:

kernel.CManager.BroadCastMessage(search);

Este método envia un mensaje haciatodos los nodos de la red PON, y porsupuesto que serán capaces de proce-sarlo aquellos que pasen los filtros (dis-pongan del tipo real del objeto) indica-dos por la aplicación cliente del nodoPON.

Personal

Estos mensajes viajan siguiendo uncamino de costo mínimo (mayor velo-cidad de transmisión) entre la fuente yel destino. Este camino se determina demanera automática por PON, garanti-zando, para no provocar atoros, quenodos PON con poco ancho de bandano sean usados como intermediarios sal-vo en los casos imprescindibles porqueno hay otra forma de llegar (figura 11).

La forma de enviar un mensaje per-sonal, es decir dirigido a un usuariodeterminado, es mediante:

kernel.CManager.SendMessageTo(UserName,textmsg);

Aquí UserName es un GUID que noes lo mismo que el Screen Name. ScreenName puede ser una cadena como porejemplo “Pepe” y no tiene porqué serúnica. La aplicación cliente de PONdebe ser muy cuidadosa con su imple-mentación y ser consistente con estapropuesta. Para identificar realmentea los nodos de modo directo (perso-nalizado) se deben utilizar losUsername (que son en realidadGUID).

La ventaja de este modo de tratar losmensajes es que usuarios detrás de uncortafuegos podrán utilizar, sin impedi-mentos, aplicaciones de intercambiosiempre que estén basadas en PON.

Sirva como ejemplo el siguienteescenario:

Un usuario A tiene un PC en suoficina en la que sólo dispone deHTTP y no tiene acceso directo aInternet. Este usuario está impedidode utilizar una aplicación como eMuleo Kazaa. Sin embargo, si eMule hubie-se estado desarrollada sobre PON, yA conociera de la existencia en su redde otro usuario B del mismo eMule,pero que si tuviera acceso a Internet,entonces A podría conectar su eMuleal eMule de B y de esta manera formarparte de la misma red eMule de B. Peroes más, no se exige que B tenga en eje-cución su eMule sino bastaría con queB estuviese ejecutando cualquier apli-cación basada en PON.

Lo anterior no viola los derechos deB, porque si lo desea B puede evitar queA lo utilice como mediador. PON pro-vee de un sencillo mecanismo medianteel cual cada aplicación puede especificar

dotN

etM

anía

<<

31

dnm.comunicaciones<<

Figura 11.Nodos PON detrás de una intranet se conectan con nodos fuera

7 Claro recuerde que las redes de intercambio se basan en el principio de que hay que dar para recibir. En el caso de eMule por ejemplo entre masse da, mas se puede recibir.

PON nos ofrece la posibilidad de formar una nueva red .NETa .NET,pero de aplicaciones heterogéneas, a la escala que nuestras conexiones lo permitan, con una mayor

seguridad para todos los usuarios

qué IPs no permite que se conecten a ella. También sepuede limitar la cantidad de conexiones entrantes ysalientes. Esto se hace poniendo las IPs que se quierenbloquear en la lista BannedIPs en la instancia dePONKErnelConfiguration que se le pasa en el construc-tor al kernel de PON (PONKernel). Por ejemplo, asu-miendo que KernelConfig es el objeto que está siendoutilizado por el kernel de PON y que el número de IPa bloquear es 192.168.121.3 habría que hacer:

KernelConfig.BannedIPs.Add("192.168.121.3");

De este modo se puede construir una nueva redde usuarios de intranets distantes que compartan infor-mación sin tener que tener acceso directo a Interneto sin tener que utilizar subterfugios como túnelesHTTP, bouncers, enmascaramientos y otros.

La figura 12 muestra un posible escenario basa-do en PON. En dicho escenario se tienen tres tiposde aplicaciones diferentes y varios nodos de cada unode ellos intercambiando información entre ellos,muchos de ellos detrás de cortafuegos en el interiorde intranets.

ConclusionesPON nos ofrece la posibilidad de formar una nue-

va red .NET a .NET, pero de aplicaciones heterogé-neas, a la escala que nuestras conexiones lo permitan,con una mayor seguridad para todos los usuarios.

PON supera algunas de las limitantes de las tec-nologías actuales. Corrige el uso de protocolos Hard-Coded así como garantiza la posibilidad de extender lared a un uso mayor si es deseado, es decir, montarnuevas aplicaciones aprovechando redes ya existentessobre PON. PON soluciona a su vez el problema delas conexiones forzadas y el problema de las redes deaplicaciones no conexas.

PON se basa en el consistente, flexible y dinámicomodelo de objetos de .NET (a nuestro juicio la plata-forma que ofrece el mejor modelo de objetos hasta elpresente). Pero además la capacidad de nombrado fuer-te de un ensamblado permite a PON garantizar, si laaplicación cliente lo decide usar, claro, un trasegar deobjetos con robustez, seguridad y privacidad. La dis-ponibilidad, en aumento, de NET para la mayoría delas plataformas como Windows, Linux, Mac y móvilesnos da la posibilidad entonces de disponer de un uni-verso P2P mejor conectado, más seguro y más fácil deque se desarrollen aplicaciones sobre él.

PON proporciona la ventaja de que los clientespueden programar aplicaciones que permitan acce-der a sus facilidades mediante una aplicación que eje-cutan localmente (sin complicadas instalaciones) y sintener que acceder a sitios Web. PON está concebidopara facilitar el desarrollo de aplicaciones que ayudena formar redes descentralizadas sin exigencia de ser-vidores, lo que no excluye la utilidad de PON en apli-caciones que necesiten de servidores.

Se han desarrollado ya algunas aplicaciones basa-das en PON que podrán ser presentadas en un futu-ro artículo.

dotN

etM

anía

<<

32

dnm.comunicaciones<<

Figura 12. Ejemplo de un posible escenario con PON

Referencias

[1] E-Book Cracking the Code: P2P ApplicationDevelopment

[2] How P2P and Kazaa Works,www.kazaa.com/us/help/guide_aboutp2p.htm

[3] How Kazaa v2 Works, ndnn.org/blog/downloads/summit/UENSummit_Peer_2_Peer.ppt

[4] forum.emule-project.net/lofiversion/index.php/t54911.html

[5] forum.emule-project.net/index. php?showtopic=46749&view=getlastpost

[6] www.emule-help.com/summary.htm

[7] Ariño, Juanjo, Lphant, primer peer to peerbajo .NET, dotNetManía No 5, junio 2004

Miguel Katrib Es Dr. y Catedrático del Departamento de

Computación de la Universidad de La Habana yjefe del grupo WEBOO dedicado a la

Orientación a Objetos y a la Programación en laWEB.Es un especialista en lenguajes de

programación y entusiasta de la tecnología .NETy el lenguaje C#.Miguel y el grupo WEBOO son

colaboradores habituales de dotNetManía

Leonardo PanequeEs estudiante del

Departamento deComputación de la Universidadde La Habana y programador y

administrador de la red delgrupo WEBOO.Paneque es un

entusiasta usuario y desarro-llador de las redes peer to peer.

Ilustraciones: Yamil Hernández

dotN

etM

anía

<<

33

Sistemas distribuidos en .NET con Remoting (II)

Después de los conceptos sobre la arquitectura de .NET Remoting que vimos en laanterior entrega,podemos zambullirnos por completo en la creación de objetos remo-tos.En este capítulo veremos un tema vital, los diferentes comportamientos que pue-den presentar los objetos remotos en .NET Remoting.A menudo la primera decisiónque tenemos que tomar a la hora de diseñar un objeto remoto o una familia de obje-tos es elegir el modelo de comportamiento de los mismos.

<< Diferentes comportamientos de losobjetos remotos

Básicamente, existen dos grandes tipos de obje-tos remotos en .NET Remoting atendiendo a su com-portamiento:• Objetos por valor (ByValue): Son objetos serializables

que son pasados en forma de copia desde el servi-dor al cliente.

• Objetos por referencia (ByRef): Son objetos remo-tos en sentido estricto que se ejecutan en el ser-vidor y permiten que el cliente realice llamadasa sus métodos. Dentro de estos objetos encon-tramos dos grandes grupos en función de cómose activan:o Objetos activados por el servidor: No se crean has-

ta que llamamos a sus métodos. Dentro de losobjetos activados por el servidor hay dos modosde funcionamiento:• Objetos SingleCall: El objeto atiende a la lla-

mada y se destruye.• Objetos Singleton: Un solo objeto atiende todas

las peticiones

o Objetos activados por el cliente: Se crean en elmomento que los instanciamos.

Objetos por valor (MBV)

El uso de objetos por valor supone serializar losobjetos, es decir, ponerles en algún formato persis-tente para luego deserializarlos en la parte clientepara su uso.

Para que un objeto sea serializable en .NET essuficiente que se le añada el atributo [Serializable]o que el objeto implemente la interfaz ISerializable.

Los objetos por valor no son objetos remotos enun sentido estricto. Todos los métodos del objeto sonejecutados de manera local respecto al cliente. Dadoque la ejecución de los objetos es local esto implicaque, al contrario que con los objetos por referencia,el código ejecutable del objeto debe estar disponibleen el lado cliente de la aplicación.

Es importante señalar también que cuando unobjeto por valor mantiene referencias a otros obje-tos, éstos deben ser objetos serializables oMarshallByRefObjects.

Rodrigo Corral

dnm.plataforma.net

Rodrigo Corralcolabora habitualmente con

dotNetManía. Es Microsoft MVPy analista de Sisteplant, empresa

líder en el sector de lasaplicaciones de gestión industrial

MarshalByRefObject

Server Activated Object(RegisterWellKnowObjectType)

SingleCall(WellKnonwObjectMode.SingleCall)

Singleton(WellKnonwObjectMode.Singleton)

Client Activated Object(RegisterActivatedServiceType)

MarshalByValObject

¿Cuándo usar objetos por valor?

• Cuando el objeto es pequeño.• Cuando vamos a hacer un uso intensivo del objeto.• Cuando la seguridad no es un factor importante.• Cuando el objeto no depende de recursos remotos.

A no ser que se cumplan estas cuatro condiciones,es más interesante usar objetos por referencia.

Ejemplo: MBVSample1

Objetos por referencia (MBR)

Los objetos por referencia heredan de la claseMarshalByRefObject.

Un objeto por referencia es un objeto totalmenteremoto, corre en el lado servidor y acepta llamadas a susmétodos públicos por parte de los clientes. Sus datos sealmacenan en la memoria del servidor y sus métodos sonejecutados en el dominio de aplicación del servidor.

Al contrario que los objetos por valor, el clienteno obtiene una copia del objeto, sino que obtiene unaespecie de puntero al objeto; esta especie de punteroes lo que se denomina proxy.

Un proxy se diferencia de un puntero en que no con-tiene la dirección de memoria en la que el objeto estáubicado, sino datos referentes al objeto (dirección IP delservidor y un identificador único del objeto) que per-miten identificar al objeto del manera única.

Como ya hemos comentado existen dos grandestipos de objetos por referencia:

• Objetos activados en/por el servidor.• Objetos activados en/por el cliente.

Objetos activados en servidor (SAO)

Son comparables, en cierto modo, a los serviciosWEB, puesto que no mantiene el estado entre llamadas.

Cuando un cliente pide una referencia a un obje-to SAO, no se envía ningún mensaje al servidor. Sólocuando alguno de los métodos del objeto es llamadoel servidor recibe una notificación.

Según la configuración del objeto, el servidor pue-de crear una nueva instancia para atender la peticióny luego eliminar el objeto, lo que es conocido comomodo SingleCall o bien puede usar un único objetopara atender todas la peticiones, lo que es conocidocomo modo Singleton.

Los objetos activados por el servidor no mantie-nen estado, aunque se puede lograr para los Singleton;esto hace que sean muy escalables.

Un problema relacionado con los objetos activadospor el servidor es que no se pueden construir más que apartir de su constructor por defecto, debido a que elcliente obtiene el proxy antes de que el objeto esté real-mente creado. Dado que los constructores se utilizanpara establecer el estado del objeto, y que los objetosSAO no mantiene estado, esto no es un gran problema.

Objetos SingleCall

Para los objetos SingleCall el servidor va a crearun objeto, ejecutar la llamada, y destruir el objeto.

Los objetos SingleCall son extremadamente esca-lables, puesto que no se “desperdician” recursos delservidor manteniendo el estado del objeto.

Otro motivo para usar este tipo de objetos es que sonmuy adecuados para realizar balanceo de carga; esto escomplicado con objetos con estado.

Para configurar un objeto como SingleCall, el hostdebe realizar la siguiente llamada:

RemotingConfiguration.RegisterWellKnownServiceType(

Typeof(<Clase>), "<URI>", WellKnownObjectMode.SingleCall);

Ejemplo: SAOSingleCallSample1

Objetos Singleton

Sólo una instancia de un objeto remoto de tipoSingleton existirá en un momento dado.

Cuando un host que ha configurado un objetocomo Singleton recibe una petición, .NET Remotingcomprueba sus tablas internas de objetos registradospara comprobar si un objeto de esa clase ya existe parael dominio de aplicación del host. Si el objeto aún noexiste se creará, si el objeto ya existe se utilizara éstepara atender la petición.

El servidor garantiza que uno y sólo un objeto vaa ser accesible al mismo tiempo.

El motivo principal para usar objetos Singleton esque los clientes puedan acceder a información com-partida. Dado que todos los clientes usan el mismoobjeto, todos los clientes ven la misma información.Si un cliente cambia el estado del objeto todos losclientes verán ese cambio.

dotN

etM

anía

<<

34

dnm.plataforma.net<<

El uso de objetos por valor suponeserializar los objetos, es decir,

ponerles en algún formato persistente para luego deserializarlos

en la parte cliente para su uso

1 Los ejemplos pueden descargarse del material de apoyo de este artículo en http://www.dotnetmania.com/Articulos/013

Las peticiones de los diversos clientes se atiendenen hilos de ejecución paralelos por ese motivo; losobjetos Singleton deben ser thread safe.

Para configurar un objeto como Singleton el hostdebe realizar la siguiente llamada:

RemotingConfiguration.RegisterWellKnownServiceType(

Typeof(<Clase>), "<URI>", WellKnownObjectMode.Singleton);

Ejemplo: SAOSingletonSample1

Objetos activados en cliente (CAO)

Los objetos activados en el cliente se comportande manera similar a los objetos no remotos. Con lasalvedad de que se ejecutan en el dominio de aplica-ción del servidor.

Cuando el cliente solicita la creación de un obje-to, éste se crea de manera inmediata. En el lado clien-te se crea un proxy que mantiene un ObjRef al igualque para los SAO.

Los objetos CAO permiten mantener el estado,las variables miembro que establezcamos se compor-tarán de la manera habitual a la que estamos acos-tumbrados.

Los objetos CAO son creados explícitamente porel cliente, por eso pueden crearse usando constructo-res diferentes del constructor por defecto.

Para configurar un objeto remoto como CAO, laaplicación host debe configurar el objeto con lassiguientes llamadas:

RemotingConfiguration.ApplicationName = "<ServerAppName>";

RemotingConfiguration.RegisterActivatedServiceType(typeof(MyRemoteObject));

La URL del objeto remoto tendra la forma:<protocol>://<hostname>:<port>/AplicationNamePara poder usar el operador new para crear obje-

tos es necesario extraer los metadatos del assembly quecontiene los objetos remotos usando SoapSuds.exe. Lalínea de comandos a ejecutar será:

Soapsuds -ia:server -nowp -oa:generated_metadata.dll

La DLL con los metadatos que se genera tiene queañadirse a las referencias del cliente.

Para poder usar el operador new para crear obje-tos remotos, es necesario registrar antes el objeto enel cliente como un objeto CAO. Para ello ejecutare-mos el siguiente código:

RemotingConfiguration.RegisterActivatedClientType(typeof(<Class>), "<ServerURI>");

Ejemplo: CAOSample1

Gestión del tiempo de vida de los objetosSin duda un punto un poco oscuro en .NET

Remoting es como se maneja el tiempo de vida de losobjetos. Los objetos “normales” de .NET son des-truidos mediante un sistema de recolección de basu-ra, que comprueba si el objeto está en uso.Evidentemente este sistema es insuficiente cuando tra-tamos con objetos remotos; el motivo es que un ser-vidor no sabe nada acerca de cuántos clientes tienenuna referencia al objeto que sirve.

En COM este problema se solucionaba medianteuna combinación de pings y contaje de referencias. Sibien es una solución válida, también es cierto que pre-senta problemas:

a. El sistema de contaje de referencias tiende a serpropenso a errores.

b. Los pings se pueden ver interferidos por la pre-sencia de firewalls.

Estos problemas han llevado a una nueva arqui-tectura para gestión de la vida de los objetos en .NETRemoting basada en concesiones (leases).

Cada dominio de aplicación contiene su propio admi-nistrador de concesiones que se responsabiliza de moni-torizar todas las concesiones dentro del dominio de apli-cación. El administrador de concesiones es el encarga-do de comprobar de manera periódica el momento enel que caducan. Si una concesión ha caducado, se invo-cará a los beneficiarios registrados de la misma y se lesofrece la oportunidad de renovarla. Si ninguno de losbeneficiarios decide hacerlo, el administrador de conce-siones los libera y el objeto remoto podrá ser recolecta-do como basura a partir de ese momento. El adminis-trador de concesiones mantiene una lista de las mismas,ordenadas según la fecha de caducidad de manera que la

dotN

etM

anía

<<

35

dnm.plataforma.net<<

Un objeto por referencia es un objeto totalmente remoto, corre

en el lado servidor y acepta llamadasa sus métodos públicos por parte

de los clientes. Sus datos se almace-nan en la memoria del servidor y sus

métodos son ejecutados en el dominio de aplicación del servidor

concesión a la que le queda menos tiempo para que cadu-que se almacena en la parte superior de la lista.

La concesiones implementan la interfaz ILease yalmacenan un grupo de propiedades que determina laspolíticas y métodos de renovación. Las renovaciones sepueden producir simplemente con una invocación a algu-no de los métodos del objeto remoto.

Cada vez que es llamado un método en el objetoremoto, el tiempo de duración de la misma se estableceen el máximo del LeaseTime actual más el RenewOnCallTime.Cuando caduca el LeaseTime, se pregunta al beneficiariosi desea renovar la concesión.

El administrador de concesiones también mantie-ne una lista de los beneficiarios (que implementan lainterfaz ISponsor) almacenados en orden decreciente enfunción de la duración. Cuando es preciso renovar unaconcesión, se solicita a uno o más beneficiarios, empe-zando por la parte superior de la lista, que lo hagan. Elprimer puesto de la lista lo ocupa el beneficiario al queprimero se ha solicitado la mayor duración para la reno-vación de su concesión. Si un beneficiario no respondeen el tiempo que dura SponsorshipTimeOut, se elimina-rá de la lista.

La gran flexibilidad de esta técnica de gestiónde vida de los objetos es que ellos mismos puedenproporcionar sus propias concesiones y, por tanto,controlar su propia duración. Cuando un objetoquiere controlar su tiempo de vida debe sobrees-cribir el método InitializeLifetimeServiceen MarshalByRefObject de la siguientemanera, especificando los TimeSpan ade-cuados para el caso.

Las propiedades de una concesión sólo se puedenmodificar cuando ésta se encuentra en su estado inac-tivo. La implementación de InitializeLifetimeServicenormalmente llama al correspondiente método de laclase base para recuperar la concesión existente para elobjeto remoto. Si la referencia para el objeto no se hacalculado con anterioridad, la concesión devuelta esta-rá en su estado inicial y se podrán establecer sus pro-piedades. Una vez se ha calculado la referencia para elobjeto, la concesión pasa del estado inicial a estado acti-vo y se ignorará cualquier intento de inicializar las pro-

piedades de la instancia (una excepción). Se llama aInitializeLifetimeService cuando se activa el objetoremoto. Se puede proporcionar una lista de beneficia-rios para la concesión con la llamada de activación, asícomo agregar beneficiarios adicionales en cualquiermomento mientras la concesión se encuentre activa.

Los posibles eventos que pueden provocar la reno-vación de una concesión son:

• Que el cliente invoque al método Renew en la cla-se Lease.

• Que la concesión solicite un Renewal a un benefi-ciario.Cuando un cliente invoca a un método en el obje-

to, la concesión se renueva automáticamente pormedio del valor RenewOnCallTime.

Cuando caduca una concesión, su estado internocambia de Active a Expired, no se pueden realizar lla-madas adicionales a los beneficiarios y el objeto se reco-lecta como basura. Puesto que en ocasiones resulta com-plicado que los objetos remotos puedan realizar una devo-lución de llamada en el beneficiario si éste se distribuyeen el Web o tras un cortafuegos, no es condición nece-saria que el beneficiario deba encontrarse en la mismaubicación que el cliente. La única condición es que elbeneficiario se encuentre en cualquier parte de la red ala que el objeto remoto pueda obtener acceso.

La utilización de las concesiones para administrarla duración de los objetos remotos constituye un enfo-que alternativo al recuento de referencias, que sueleresultar de mayor complejidad y menor precisión enconexiones de red menos confiables. Aunque en prin-cipio pueda parecer que la duración del objeto remo-to se amplía más de lo necesario, la reducción en el trá-fico de la red que suponen el recuento de referencias yla solicitud de eco de los clientes, hacen de las conce-siones una solución muy efectiva.

En la próxima entrega veremos cómo utilizar archi-vos de configuración para configurar las característicasde nuestros objetos, lo que nos va a permitir que el códi-go sea mucho más legible evitando tener que crear loscanales y registrar los objetos desde el código. Tambiéncrearemos un servicio que nos servirá como host gené-rico para nuestros servidores de Remoting. Así mismoveremos que podemos alojar nuestros objetos en un ser-vidor Web utilizando Internet Information Server.

dotN

etM

anía

<<

36

dnm.plataforma.net<<

public class Sample : MarshalByRefObject {public override Object InitializeLifetimeService(){ILease lease = (ILease)base.InitializeLifetimeService();if (lease.CurrentState == LeaseState.Initial) {lease.SponsorshipTimeout = TimeSpan.FromMinutes(1);lease.InitialLeaseTime = TimeSpan.FromMinutes(1);lease.RenewOnCallTime = TimeSpan.FromSeconds(1);

}return lease;

}}

Fuente 1

dotN

etM

anía

<<

37

Interoperabilidad no administrada y migración (II)

La interoperabilidad de .NET desde COM es quizás mas inusual aunque sus ventajas nosofrecen una nueva técnica en un entorno de migración e interoperabilidad.En esta entre-ga conoceremos cómo utilizar dicha técnica además de las consideraciones previas parainteroperar de una manera más eficiente.

En el número anterior hablamos de cómo utilizá-bamos un componente COM en un proyecto bajo CLRy ahora planteamos todo lo contrario, cómo un compo-nente .NET lo utilizamos desde un proyecto Visual Basic6.0, por ejemplo. Lo más obvio es que sea el primer caso,ya que en un proceso de migración se suele plantear lacodificación de nuevo código en .NET y aprovechar elantiguo basado en COM bajo el paraguas de CLR. Peroestoy seguro que en algunos casos será necesario crearun componente en .NET y que éste funcione bajo unaaplicación en Visual Basic 6.0, sea por ejemplo, porquela política de migración así lo requiera.

Antes de empezar a codificar nada daremos aconocer una serie de requisitos que deberán tener lasclases .NET que pretendan ser utilizadas por com-ponentes COM. Recordemos que COM callable wrap-per (CCW) será el objeto que hará de puente y nosfacilitará el proceso y cuando hagamos la llamada alcomponente NET desde COM, realmente estare-mos llamando a un objeto CCW.

En primer lugar se debe implementar una inter-faz en el código administrado a la clase pública. Porejemplo, creamos un nuevo proyecto de bibliotecade clases en C# llamado NETaCOM. Seguidamente enla clase ponemos el nombre clsPrueba y añadimos alespacio de nombre predeterminado el fuente 1.

En segundo lugar, hay que procurar declarar explí-citamente la accesibilidad tanto de la clase como delos métodos o elementos que queremos que sean acce-sibles desde COM. Fíjese que hemos creado unainterfaz y que la clase clsPrueba implementa dichainterfaz. Esto es imprescindible para tener accesibi-lidad desde componentes COM.

José Miguel Torres

dnm.plataforma.net

<< Implementar .NET desde COM

José Miguel Torrescolabora habitualmente con

dotNetManía. Es técnicosuperior en desarrollo de

aplicaciones informáticas ytrabaja como arquitecto de

software en el departamento detecnologías de la

información de MRW

using System;namespace NETaCOM{public interface IPrueba{// dos propiedadesstring Version{get;set;}int Numero{get;set;}

// utilizaremos dos métodosvoid Generar(int newNumero);string Resultado();

}

/// <summary>/// Este será una clase administrada que/// utilizaremos desde COM (Visual Basic 6.0)./// </summary>public class clsPrueba : IPrueba{//atributosprivate string _version;private int _numero;public clsPrueba(){}

// dos propiedadespublic string Version { get {return _version;}

set {_version = value;} }public int Numero{ get{return _numero;}

set{_numero = value;} }

// utilizaremos dos métodospublic void Generar(int newNumero){

_version += "." + newNumero.ToString();}public string Resultado(){

return _version.Substring(0,_numero).ToString();}

}}

Fuente 1. Ejemplo de clase .NET codificada para que pueda ser llamada desde COM.

dotN

etM

anía

<<

38

dnm.plataforma.net<<

Aunque no es estrictamente necesario, sí se reco-mienda firmar el ensamblado con un nombre segu-ro. El firmado mejorará la generación de los identi-ficadores de clase (CLSID) para las clases adminis-tradas. Utilizando sn.exe creamos un archivo de fir-mado llamado NETaCOM.snk. Es importante asignar elatributo AssemblyTitle del ensamblado ya que equi-vale al nombre del proyecto en Visual Basic 6.0.

Hasta este punto hemos desarrollado y firmadoun ensamblado, el componente .NET que utilizare-mos desde COM. El siguiente paso consiste en laimplementación, es decir, tenemos que crear la biblio-teca de tipos del ensamblado. La herramienta queutilizaremos para tal fin es TlbExp.exe. Ésta se eje-cuta desde la consola del intérprete de comandos deVisual Studio .NET, igual que TlbImp.exe, y el pro-ceso será muy similar.

C:\TlbExp.exe NETaCOM.dll /out:NETaCOM.tlb

El archivo resultante es la biblioteca de tipos delensamblado con extensión .TLB. Seguidamente regis-traremos la biblioteca de tipos con regasm /tlb. Deesta forma expondremos el componente para queesté disponible para los clientes COM a partir delensamblado indicado en el segundo parámetro. Lasintaxis es la siguiente:

C:\Regasm /tlb: NETaCOM.tlb NETaCOM.dll

Por último, se recomienda mediante gacutil.exeinstalar el ensamblado en la caché global (GAC) paraque se encuentre disponible (ensamblado comparti-do) para los posibles clientes COM, así que:

C:\gacutil.exe /i NETaCOM.dll

Si no se realiza ésta última, y deseamos tener elensamblado en un contexto privado, deberemoscopiar el archivo NETaCOM.dll en el directorio de laaplicación VB 6.0 (figura 1).

Para terminar haremos una prueba desde VisualBasic 6.0. Trataremos de referenciar en un nuevo pro-yecto el fichero TLB y crearemos unas instancias ala clase. En un nuevo proyecto de Visual Basic 6.0 enel menú referencias localizamos el archivo resultan-te como muestra la figura 2.

Desde el fuente 2 creamos un objeto NETaCOM.IPruebae interactuamos:

Ahora que los estamos viendofuncionar, fijémonos en que real-mente hemos instanciado la inter-faz IPrueba, aunque creemos unobjeto de tipo clsPrueba. Cuandointentamos instancias con set, porejemplo, el método QueryInterfacede la interfaz de COM IUnknown,comprueba si admite clsPrueba. A

Figura 2. Localización y referencia de la biblioteca de tipos resultante de un componente .NET desde Visual Basic 6.0.

Fuente 2

Figura 1. Estructura de directorios y entrada del Registro para implementación privada.

Private Sub Form_Load()Dim objeto As NETaCOM.IPruebaSet objeto = New clsPrueba

objeto.Numero = 2objeto.Version = "1.1"MsgBox objeto.Resultado

Set objeto = NothingEnd Sub

partir de aquí de rienda suelta a su imaginación y dis-frute de la interoperabilidad .NET a COM.

Consideraciones previas para interoperar

Si en un futuro pretendemos seguir desarrollan-do componentes basados en COM quizás nos intere-se saber algunas consideraciones para que éste puedaser utilizado desde .NET.

Hasta ahora hemos visto todas las diferencias y nospodríamos hacer una idea aproximada, pero en resu-midas cuentas, ¿qué debemos tener en cuenta?

Pues bien, en primer lugar crear biblioteca de tipo.Como hemos visto, por defecto Visual Basic 6.0 cre-aba dichas bibliotecas dentro del archivo .DLL o .EXEActiveX de manera implícita, incluso podíamos sepa-rar la biblioteca de tipos en un archivo .TLB. Quizásotros lenguajes no tengan dicha funcionalidad y en esecaso sería conveniente asegurarnos de crear la biblio-teca de tipos. Igual de importante es “crear” que regis-trar dichas bibliotecas de tipos e incorporar la infor-mación regional y de versión.

Utilizar matrices de longitud fija ya que son auto-descriptivas. Así el contador de referencia podrá cal-cular el tamaño, el rango y el límite en tiempo de eje-cución. Utilizar tipos de datos que se puedan repre-sentar en bits o bytes para facilitar el trabajo en el cál-culo de referencias. Asimismo evitar las llamadas inter-modulares ya que implica un mayor costo del cálcu-lo de referencias y limitar al máximo el retorno devalores HRESULT si trabajamos con C++. Liberar recur-sos explícitamente. El ejemplo más claro sería el Set obj=Nothing utilizado en Visual Basic 6.0.

Por otra parte, si lo que desea es generar un compo-nente .NET cuyo cliente esté basado en COM, evite losconstructores con parámetros y los miembros estáticos.Utilice HRESULTpara las excepciones definidas por el usua-rio, así como defina interfaces públicas que implemen-ten la clase administrada y para facilitar el trabajo, asig-ne identificadores únicos GUID.

Migración e interoperabilidadEl principal objetivo de la interoperabilidad es la

integración de varias tecnologías. Éste es el pilar fun-damental para la migración escalonada. Cuando unaempresa posee una arquitectura o aplicación distri-buida totalmente funcional y se plantea la evoluciónde la misma, la migración total es una opción muy cos-tosa en cuanto a desarrollo y a curva de aprendizajedel personal, y delicada, ya que se van a poner en mar-cha nuevos modelos de programación.

La remodificación de nuevos componentes .NETque interoperen con los COM existentes ofrece, dentrode las estrategias de migración, por ejemplo, una opciónmuy válida, ya que desde un principio se desarrollan com-

ponentes, sea cual sea la capa funcional (datos, negocio...),en una nueva tecnología. Sin embargo, la etapa de cap-tación de nuevas necesidades y de análisis inicial siguesiendo imprescindible, puesto que el alcance de la apli-cación no es la misma con la llegada de .NET, Longhorno Yukon (éstos próximamente), entre muchos otros.

Como en casi todo, no existe una fórmula o planti-lla estándar milagrosa, pero sí existen herramientas ymetodologías experimentadas por otros, como el ejem-plo de la migración horizontal, en la que se plantea lamigración de arquitecturas DNA 2000 a .NET por capas,o la migración vertical en la que se plantea la migraciónpor procesos de negocio, desde la capa de usuario a lacapa de datos. Todo esto no son más que posibilidadesque cada empresa deberá estudiar, decidir e implemen-tar y en las que los servicios, como los que ofrece el CLRpara facilitar la interoperabilidad, son un apoyo más a laevolución permanente de las aplicaciones adecuándoseo no, allá cada uno, a las últimas tendencias tecnológi-cas que aparecen tras la mercadotecnia.

Lo que es bastante evidente es que tras el ciclo delque habla Microsoft de 7 a 10 años, COM será unapequeña parte del volumen de código que se maneja-rá, mientras ambos contextos, administrado o no, con-vivirán entre ellos.

ConclusiónEn esta entrega hemos visto la interoperabilidad entre

COM y .NET y viceversa. Asimismo, hemos descritounos consejos para mejorar la interoperabilidad y ade-más hemos conocido todas las técnicas para dicho fin;bien, todas menos una. Me explico. En la primera partehablamos de una clase, TypeLibConverter, que permitela exportación e importación de biblioteca de tipos aensamblados y que aún no hemos visto. La utilizaciónde esta clase y la interoperabilidad con funciones de DLLsexternas, será la siguiente parte sobre la interoperabili-dad no administrada.

dotN

etM

anía

<<

39

dnm.plataforma.net<<

La remodificación de nuevos componentes .NET que interoperen con los COM existentesofrece, dentro de las estrategias de migración,

una opción muy válida, ya que desde un principio se desarrollan componentes, sea cual sea la capa funcional (datos, negocio...),

en una nueva tecnología

SQL Server Analysis Services¡Hola Cubo! (y IV)

Llegó el momento de explotar los datos almacenados en nuestra base de datosmultidimensional, desde algunas de las herramientas cliente que Microsoft nosofrece para ello.Aquí mostraremos el Examinador de cubos del Analysis Manager,Microsoft Excel utilizando el PivotTable Service, la aplicación de ejemplo que vie-ne con Analsys Services y Microsoft Data Analyzer.

<< como supongo que estaréis ansiosos deempezar a ver la información y a “jugar” con ella, vamosa utilizar el Examinador de Cubos, para ello pulsaremos elbotón secundario del ratón sobre nuestro cubo y elegi-remos la opción “Examinar datos”.

Con esta herramienta podréis ir realizando mul-titud de consultas simplemente arrastrando y soltan-do las diversas dimensiones sobre las áreas de filas ycolumnas. También es importante destacar que sobrelas dimensiones que tenéis en la parte superior, si des-plegáis cualquiera de los combos podéis filtrar la infor-mación que se visualizará en el área de datos, donde

se muestran las medidas en función de las dimensio-nes colocadas en las áreas de filas y columnas y de losfiltros establecidos. En nuestro caso hemos colocadolas medidas Artículo y Tiempo en el área de filas, yestamos mostrando todas las medidas en el área dedatos, ya que esta herramienta sólo tiene la opción demostrar todas las medidas del cubo.

Aunque con esta herramienta podemos visualizarcierta información, no es suficiente para obtener todoel rendimiento que esperamos de la información alma-cenada. Simplemente la utilizaremos durante etapasde desarrollo y modificaciones, para comprobar rápi-damente los resultados.

Hay en el mercado gran variedad de herramientasque nos facilitan el acceso a información almacenadaen cubos, aunque aquí vamos a mostrar sólo el acceso

Salvador Ramos

dnm.servidores.sql

En primer lugar,

Salvador Ramoscolabora habitualmente con

dotNetManía. Es Microsoft SQLServer MVP y responsable del

sitio HelpDNA.net.Trabaja comodirector de informática de la red

de estaciones de servicio Andamur

Figura 1.Acceso al examinador de cubos desde el Analysis Manager.

Figura 2.Vista del examinador de cubos mostrandouna consulta del cubo Ventas.

desde Microsoft Excel y Microsoft Data Analyzer, ytambién accederemos desde la aplicación de ejemploMDX que viene con el producto para introduciros enel lenguaje de consultas multidimensionales.

Por el momento, nos ha funcionado el acceso a lainformación sin problemas, porque en la máquina don-de estamos probando están instaladas las herramien-tas cliente de Analysis Services, pero vamos a cono-cer en primer lugar qué necesitamos para tener dis-ponible la conectividad entre el cliente y el servidordesde las diferentes herramientas y aplicaciones.

Podemos utilizar OLE DB para OLAP o ADO MD(ActiveX Data Objects Multidimensional) para escribir códi-go que nos permita manipular y acceder a cubos desdenuestras aplicaciones. También tenemos disponible ADOMD .NET para su utilización desde la plataforma .NET.El PTS (PivotTable Service), que es el cliente de los ser-vicios OLAP, nos proporciona el interfaz que permite alas aplicaciones cliente conectarse al servidor OLAP deSQL Server, mediante los dos métodos citados ante-riormente. También es importante saber que MicrosoftExcel, a partir de la versión 2000, incorpora la funcio-nalidad del PivotTable Service permitiendo acceder aAnalysis Services y a cualquier otra fuente de datos rela-cionales, proporcionándonos así una potente herra-mienta de análisis. PTS no es una herramienta de usua-rio final, no tiene una interfaz de usuario, incluso pue-de pasar totalmente desapercibido que lo estamos utili-zando, ya que se instala tanto con las herramientas clien-te de Analysis Services como con MS Excel. Es un com-ponente oculto que proporciona la conectividad y lasinterfaces para interactuar con el servidor. Además, faci-lita la posibilidad de poder realizar operaciones en moda-lidad desconectada, ya que la información que viaja alcliente se almacena en él, y posteriormente podemosanalizarla sin requerir el acceso al servidor. Es decir,podemos acceder, por ejemplo, desde una Excel al ser-vidor, obtener unos datos y guardar la hoja. Esta hojapuede ser enviada a cualquier persona, y aunque no ten-ga conexión con el servidor la podrá utilizar sin proble-mas, aunque evidentemente no podrá actualizar connuevos datos almacenados en el servidor, ni realizar con-

sultas ad hoc si no dispone de conectividad, sólo tendráacceso a los datos almacenados anteriormente, perdiendoel dinamismo que nos ofrece cuando estamos conecta-dos al servidor.

Comencemos a usar MS Excel para analizar la infor-mación de nuestra base de datos. Para ello utilizaremoslas Tabla Dinámicas, que son tablas interactivas que nospermiten trabajar con datos, interactuar con ellos, yrealizar consultas ad hoc de una forma muy rápida ysencilla. Es importante matizar que una Tabla Dinámicano es lo mismo que PTS, sino que Excel utiliza PTSpara manipular Tablas Dinámicas. Otro detalle muyimportante es que es imprescindible tener instalado elcomponente Microsoft Query de MS Office para poderutilizar las tablas dinámicas.

Desde Microsoft Excel, iremos al menú “Datos”,seleccionaremos “Obtener Datos Externos” y “Nuevaconsulta de bases de datos”, apareciéndonos una ven-tana para elegir el origen de datos. Como podéis com-probar, esa ventana nos permite conectarnos a diver-sos orígenes de datos, en nuestro caso iremos a la pes-taña “Cubos OLAP”.

Allí elegiremos “Nuevo origen de datos” y pulsa-mos “Aceptar”, apareciéndonos una nueva ventanadonde introduciremos los datos para conectarnos anuestro cubo de ejemplo, dándole al origen de datosel nombre Ventas dotNetMania, y utilizando el prove-edor Microsoft OLE DB Provider for OLAP Services 8.0,y seguidamente pulsamos el botón “Conectar”, apa-reciéndolos una pantalla con un asistente para la cone-xión, que rellenaremos según los datos que se mues-tran en la figura 4 (si el servidor de Analysis Servicesno está en la máquina local, indicar el nombre del ser-vidor o su dirección IP).

Pulsamos el botón “Siguiente”, y a continuaciónseleccionamos la base de datos multidimensional, ennuestro caso es dotNetMania, y pulsamos el botón“Finalizar”.

Ahora ya podemos seleccionar el cubo que dese-emos entre los disponibles en la base de datos selec-cionada, que en nuestro caso será Ventas ya que es elúnico que tenemos disponible. Finalmente pulsamosel botón “Aceptar”, con lo que ya tendremos creado

dotN

etM

anía

<<

41

dnm.servidores.sql<<

SQL Server Reporting Services es unanueva plataforma de elaboración de informes,que también permite la creación de solucionesBusiness Intelligence. Puede ser otra alternativamuy interesante para el desarrollador a la horade crear informes que accedan a los datos quetenemos almacenados en nuestros cubos.

Recuerde el lector que esta herramienta vieneincluida con SQL Server 2000, sin coste adicional.][

Figura 3. Creación de un origen de datos para acceder al cubo Ventas.

nuestro origen de datos. Es el momento de seleccio-narlo y pulsar nuevamente el botón “Aceptar”. Esteproceso ya no necesitaremos volver a realizarlo cuan-do queramos acceder de nuevo a nuestro cubo deventas, simplemente tendremos que seguir los pasosiniciales hasta llegar a esta ventana y aquí elegir elorigen Ventas dotNetMania.

Ya estamos de nuevo en nuestra hoja de cálculodonde simplemente nos queda elegir la celda a par-tir de la cual se introducirá la tabla dinámica y pul-sar el botón “Finalizar”.

Pues bien, ya tenemos nuestra primera tabla diná-mica con acceso al cubo Ventas de nuestra base de datosmultidimensional dotNetMania. Pasaremos a explicarbrevemente la utilización de esta herramienta.

En la parte derecha aparece una ventana dondetenemos todas las dimensiones y medidas de nuestrocubo, y podemos pinchar en ellas y arrastrarlas a lasáreas indicadas en la figura 6. Las dimensiones(Artículo, Cliente, Forma de Pago, Provincia y Tiempo)están en la parte superior de la ventana, y llevan unicono con unas líneas azules, así como el signo + quenos permitirá ver la jerarquía con los diferentes nive-les que tiene cada una de ellas, y en la parte inferior,con iconos rellenos con ceros y unos, tenemos las medi-das (Cantidad, Pr Compra y Precio). Las dimensionespueden ser arrastradas al área que aparece en la parte

superior izquierda, en nuestro caso en la primera filade la hoja Excel, si queremos utilizarlas para filtrardatos. También las podemos situar en las áreas de filasy columnas, para ver sus miembros. Finalmente debe-mos arrastrar las medidas al área de datos. Así con-seguimos filtrar por las condiciones que deseemos, ycruzar los valores de las medidas seleccionadas enfunción de las dimensiones elegidas en las áreas defilas y columnas.

Vamos a ver un ejemplo de uso, explicando pasoa paso cómo obtener los datos mostrados:

• Arrastramos la dimensión Artículo al área defiltro, desplegamos el cuadro combinado yseleccionamos la familia Regalos [6].

• Arrastramos la dimensión Tiempo al área decolumnas.

• Arrastramos la dimensión Provincia sobre elárea de filas.

• Arrastramos la medida Cantidad sobre el áreade datos.

Con estos pasos tan simples ya tenemos de formadinámica en pantalla una tabla que nos representa lascantidades de artículos de la familia Regalos vendidosdurante los años 2000 y 2001 en cada una de las pro-vincias que han tenido ventas. Si ahora queremos verlos resultados por trimestres, sólo tenemos que hacerdoble click sobre cada miembro de la dimensión tiem-po, en nuestro caso sobre los años 2000 y 2001, apare-ciéndonos un detalle trimestral y manteniéndose la sumaanual. Si ahora deseamos ver los resultados totales, envez de los de una sola familia, debemos quitar el filtrode la familia Regalos, y seleccionar en el cuadro com-binado el valor “Todas Artículo”.

Como veis es muy sencillo el uso de estas tablasdinámicas, utilizando las técnicas de arrastrar y sol-tar, desplegando los cuadros combinados, y selec-cionando valores. Incluso se pueden seleccionar múl-

dotN

etM

anía

<<

42

dnm.servidores.sql<<

Figura 4. Selección del servidor de Analysis Services.

Figura 5. Elección del origen de datos creado anteriormente.

Figura 6.Tabla dinámica en Excel lista para realizar consultas Ad hoc sobre el cubo Ventas.

tiples valores, para ello en el cuadro combinado debe-mos marcar, una vez desplegado, la opción “selec-cionar varios elementos”. Adicionalmente, porsupuesto, seguimos manteniendo todas las posibili-dades de Excel para hacer cálculos sobre estos datosen otras celdas que estén fuera de la tabla dinámica,para dar formato, o incluso crear gráficos dinámicosde una forma tan fácil como pulsar la tecla F11. Eneste caso lo más apropiado es utilizar un gráfico cir-cular, en vez de un gráfico de barras; para hacer estecambio, pulsamos botón derecho sobre el gráfico,elegimos la opción “Tipo de gráfico” y allí seleccio-namos “circular”, pudiendo elegir también entre dife-rentes formatos de gráficos circulares, en dos dimen-siones, en tres dimensiones, etc…

Como podéis comprobar la utilización de las tablasdinámicas para realizar consultas ad hoc sobre una hojaExcel es muy sencilla, y adicionalmente, el usuario pue-de agregar información introduciendo fórmulas en las

celdas, y mejorar su presentación (en nuestro caso hemosdado formato numérico con dos decimales a las colum-nas B, C y D) dependiendo de los conocimientos que ten-ga de la herramienta. Lo que sí es recomendable, es queprofundice en los conocimientos sobre tablas y gráficosdinámicos en Excel.

Pasemos ahora a la utilización de otra herramientaque nos permite consultar de una forma sencilla einteractiva los datos, MS Data Analyzer. Esta herra-mienta nos facilita el análisis de los datos de nego-cio, con una interfaz muy amigable, permitiéndonosresolver una gran cantidad de preguntas que nospodamos hacer sobre el estado de nuestro negocio,mediante múltiples vistas de nuestros datos.

Vamos ahora a ver un pequeño ejemplo de su uti-lización. Abrimos la herramienta, y elegimos “Createa new view”, y se activa un asistente que nos permi-tirá configurar nuestra vista. En primer lugar debe-mos crear una nueva conexión, para ello pulsamos elbotón “Add”, y rellenamos los datos como se mues-tra en la siguiente figura.

Y pulsamos el botón “Connect”, teniendo acce-so así a las bases de datos y cubos de nuestro servi-dor. En nuestro caso elegiremos los elementos mos-trados en la figura 10, y pulsaremos el botón “OK”.

A continuación pulsamos el botón “Next >>” delasistente, pasando así a la pantalla donde elegimoslas dimensiones con las que deseamos trabajar; eneste caso seleccionaremos Cliente, Provincia y Tiempo.

Y pulsamos el botón 'Next >>' dejando los valoresque aparecen por defecto. En la pantalla siguiente pul-samos el botón 'Finish'. Obteniendo como resultadonuestra vista, sobre la que podremos ir haciendo las con-sultas ad-hoc que deseemos y cambiando las vistas decada uno de los paneles resultantes.

Por ejemplo, al pinchar en el elemento “MUR-CIA” del panel central, veréis que cambian los resul-tados de los otros dos paneles, ya que acabamos de

dotN

etM

anía

<<

43

dnm.servidores.sql<<

Figura 7. Resultado de la consulta que hemos realizado paso a paso.

Figura 8. Resultado del gráfico correspondiente a los datos de la figura 7.

Figura 9. Propiedades de la conexión a AnalysisServices desde Data Anlyzer.

hacer un filtro, mostrando sólo los datos referentesa Murcia. Si a continuación hacemos doble click sobreel elemento “2001” del panel de la derecha, pasare-mos a ver un detalle de cada uno de los trimestres del

año 2001 para la provincia de Murcia. También sepuede cambiar el formato de cada uno de los pane-les, posicionando el ratón en el ojo que aparece en laparte inferior izquierda, apareciendo tres opcionesde visualización de datos, que son, Bars (que es la queestamos utilizando), Grid (para mostrar los datosnuméricos) y un gráfico de tarta (para mostrar los datosen este formato).

En fin, no quiero profundizar en el uso de estaherramienta, simplemente quiero que veáis su poten-cia y dinamismo a la hora de mostrar datos proce-dentes de un cubo. Y dejo al lector las tareas de irinvestigando y manipulando esta sencilla herramientaque nos proporciona Microsoft dentro de la familiade MS Office, que como el resto de herramientas dela familia, va orientada al usuario final, le facilita enor-memente el trabajo, y aumenta su productividad.

Pasemos ahora a ver la última herramienta de lasque estamos tratando en este artículo, que posiblementesea la que más interese al desarrollador que quiera ini-ciarse en el desarrollo de aplicaciones que accedan a losAnalysis Services. Es la aplicación de ejemplo MDX queviene con el producto, que nos permitirá utilizar de unaforma sencilla el lenguaje de expresiones multidimen-sionales (MutiDimensional eXpresions). Esta aplicaciónha sido desarrollada en Visual Basic 6, y además se acom-paña todo su código fuente, que puede servir de ayudapara el desarrollador que quiera incorporar estas tec-nologías en sus aplicaciones. El fuente lo podéis encon-trar en la carpeta C:\Archivos de programa\MicrosoftAnalysis Services\Samples\MDXSample o si habéis ele-gido otra ruta para la instalación en carpetaSamples\MDXSample de vuestra instalación.

El lenguaje MDX es para las bases de datos mul-tidimensionales lo que SQL para las bases de datosrelacionales. Además es similar en muchos aspectosen su sintaxis, aunque siempre habrá que tener encuenta que cada uno está diseñado para una tecno-logía muy diferente. Al igual que una consulta SQL,una consulta MDX tiene una cláusula SELECT, que

dotN

etM

anía

<<

44

dnm.servidores.sql<<

Figura 10. Selección de la base de datosy el cubo a analizar.

Figura 11. Selección de las dimensiones a mostrar en las vistas.

Figura 12.Vistas seleccionadas, preparadas para recibir consultas Ad-Hoc.

Figura 13. Resultado de las operaciones de ejemploindicadas paso a paso.

pasaremos a ver a continuación. Sin embargo, esimportante que conozca el lector una serie de dife-rencias a nivel conceptual:

• Tiene comandos diseñados para recuperarestructuras de datos multidimensionales.

• La cláusula SELECT define varias dimensiones deleje.

• La cláusula WHERE filtra los datos por una dimen-sión o miembro específico, proporcionando unsubconjunto de datos.

Sintaxis básica:

SELECT <especif-eje> [, <especif-eje>…]FROM <especif-cubo>WHERE <especif-filtro>

Vamos a poner un ejemplo muy sencillo ya queaquí simplemente queremos transmitir al lector la exis-tencia de este lenguaje, sin entrar en más detalles. Sidesea introducirse en el desarrollo de aplicaciones queaccedan a bases de datos multidimensionales, reco-miendo que lea los comentarios sobre diversos librospublicados número anterior de dotNetManía.

Comenzaremos abriendo la Aplicación de ejemploMDX.

Y escribiendo allí la instrucción que aparece en lafigura 15.

Como puede comprobar se trata de una herramientaque nos recuerda al Query Analyzer en cuanto a suinterfaz y funcionalidad, ya que nos permite escribir yejecutar consultas MDX. En la parte superior escribi-mos nuestra consulta y vemos los resultados en la par-te inferior. Desde aquí, se pueden ejecutar cuantas ins-trucciones se deseen, y además se puede almacenar parareutilizarlas posteriormente.

Con esta pequeña muestra finalizamos nuestra bre-ve introducción a estas herramientas, unas para el usua-rio final y otras para el desarrollador.

ConclusiónEspero que os haya resultado útil esta serie de artí-

culos, y que al menos os haya servido para familiarizaoscon el entorno de los Analysis Services. Como veis, estoes sólo la punta del iceberg de una tecnología que cadavez se está implantando más en nuestras empresas.

Con unas pocas horas de estudio y de práctica podréisponer en marcha una pequeña base de datos multidi-mensional con información muy útil, que os permitiráque los usuarios puedan consultar datos de forma diná-mica, con muy poco tiempo de formación. Os aseguro,que una vez desarrollados los cubos, con un par horas enlas que les expliquéis algunos conceptos básicos y les pro-pongáis algunos ejercicios, pueden empezar a sacar par-tido a los datos desde MS Excel o MS Data Analayzer.Esta formación quedará rápidamente amortizada por eltiempo que ahorraréis en el diseño de listados estáticos,y de las posteriores modificaciones que os solicitan losusuarios, ya que les estamos facilitando una herramien-ta donde ellos mismos pueden variar cuantas veces dese-en sus informes.

dotN

etM

anía

<<

45

dnm.servidores.sql<<

Figura 14.Acceso a la Aplicación de ejemplo MDXdesde el menú Inicio.

Figura 15. Resultado de la ejecución de una consulta MDX.

Si instaláis MS Data Analyzer sobre un siste-ma operativo Windows que no esté en inglésdebéis descargar e instalar el siguiente parche:

Microsoft Data Analyzer 3.5 International Update(http://www.microsoft.com/downloads/details.aspx?Fam i l y I D = e b 2 c f e 7 9 - 8 e 3 9 - 4 c 1 8 - b 5 7 a -ae918a13c4ac&DisplayLang=en) ][

Es recomendable tener instalada la última ver-sión de Microsoft Data Access Components,actualmente es la versión MDAC 2.8. Podéis des-cargarla en:

http://www.microsoft.com/downloads/details.aspx? Fa m i l y I D = 6 c 0 5 0 f e 3 - c 7 9 5 - 4 b 7 d - b 0 3 7 -185d0506396c&DisplayLang=en ][

Uso no autorizado de redes WIFI:Consecuencias en el ámbito penal

En los últimos apenas dos años hemos podido advertir la aparición de sistemas decomunicaciones inalámbricas, que permiten el acceso a Internet en entornos máso menos amplios, y que, en no pocas ocasiones, exceden el ámbito de estableci-miento del titular de la red.

implantación de este sistema de acceso, que permitedotar de una infraestructura de comunicaciones a entornostanto domésticos como empresariales (hoteles, aeropuer-tos, cafeterías y universidades) a un coste casi marginal, mue-ve a la reflexión. Máxime si tenemos en cuenta que buenaparte de ellos carece de un nivel de seguridad adecuado.

Esta falta de medidas de seguridad motiva que usuariosde medios técnicos que detectan, en ocasiones sin acciónvoluntaria, la existencia de una de tales redes, tengan la posi-bilidad de utilizarla para acceder a Internet (cuando no a lamáquina o a la red interna de su titular). Lo plantea el pro-blema de la consideración jurídica que debe darse a la con-ducta de quien prevaliéndose tales posibles fallos de segu-ridad por acción u omisión, utiliza parte del ancho de ban-da única y exclusivamente para fines que no suponen unaintromisión en la esfera privada del responsable de la red,y, singularmente, para acceder a Internet.

Quizás la primera consideración respecto de la tras-cendencia jurídica de quien instala una red inalámbrica quepuede rebasar el ámbito doméstico o empresarial en que seencuentra instalada, es que tal conducta, cuanto menos, escarente de la necesaria diligencia, por causarse un daño atercero, por ejemplo, puede suponer una situación de ries-go, pero en tanto no suceda el hecho lesivo, la conductadebe ser considerada como jurídicamente neutral, y, porotro lado, nunca las victimas son culpables del delito, algoque no hay que perder de vista.

Calificación jurídicaLa calificación jurídica que deba darse a la conducta del

tercero que accede a Internet utilizado el ancho de bandanegligentemente ofrecido por el titular de la red reviste unaverdadera complejidad.

Para comenzar hay que distinguir entre dos conductasdiferentes. La del usuario de un aparato que lo conecta enun lugar determinado, tras lo cual éste detecta un punto deacceso no protegido, que emplea. Y de de quien pasea la

ciudad buscando activamente la existencia de puntos de acce-so no protegido (conducta que se conoce como wardriving),con objeto de utilizarlo para fines igualmente ilegítimos.

Es evidente que quien accede a una red de comunica-ciones sin estar autorizado, y con independencia de si la redestá protegida o no, y emplea una parte del ancho de ban-da para su propio beneficio, está realizando una conductaantijurídica. La complejidad es su tipificación.

Consecuencias penalesEn el campo penal, es evidente que no nos encontramos

ante el supuesto típico del artículo 197.1 del Código Penal,pues la intención tanto de usuario que encuentra el punto deacceso desprotegido, como la de quien activamente lo bus-ca, no persigue conocer los secretos o vulnerar la intimidadde ningún tercero, lo que excluye la aplicación de este tipo.Tampoco parece que nos encontremos en el marco del sub-tipo del delito de desordenes públicos del que trata el artí-culo 560.1, pues una red de comunicaciones privada, aunqueutilice el dominio público (lo que sucede cuando la señal reba-sa los límites del edificio y es accesible desde la calle) no esni una línea o instalación de telecomunicaciones, ni tampo-co puede calificarse de servicio público.

Descartados los anteriores tipos, hay que considerar laposibilidad de la conducta en cuestión pueda entrañar la comi-sión del delito de daños por defraudación de fluido de tele-comunicación al que se refiere el artículo 255. Es evidenteque el uso no autorizado de parte de la banda de un acceso aInternet puede calificarse de fraudulento, pues hay una apro-piación de un servicio ajeno, lo que genera un daño econó-mico, en la fracción que el titular del ancho de banda con-trató y paga pero no puede usar precisa y exclusivamente porla acción fraudulenta. Por ello, es defraudatoria la conductade quien busca activamente el acceso desprotegido, pues estáutilizando las telecomunicaciones (la dicción del texto legalno es precisamente afortunada) de las que es titular un ter-cero y, además, a dicho fin se vale de un mecanismo instala-

José Antonio Suárez

dnm.legal

<< La creciente

José Antonio Suárezes socio director de Suárez

de la Dehesa Abogados,despacho especializado en

Propiedad Intelectual e Industrialy Nuevas Tecnologías.

do expresamente para realizar la defrauda-ción (el ordenador en modo de localizaciónde señales wifi y, en su caso, la antena quemejora el resultado de la búsqueda). Ahorabien, en este supuesto la posible exclusión dela tipicidad puede venir impuesta por el hechode que será bastante dificultoso acreditar queel importe defraudado, es decir el precio dela parte del servicio cuyo uso sólo ha sido posi-ble con el concurso del fraude, y no el per-juicio causado, excede de cuatrocientos euros,dados los precios del servicio del que ilícita-mente se está aprovechando.

Más oportunidades ofrece el artículo256, pues sólo requiere el uso de un termi-nal de telecomunicaciones sin consenti-miento de su titular, y causando a éste unperjuicio superior a cuatrocientos euros. Elproblema en este caso será, una vez más, pro-bar que el perjuicio excede de 400 Euros,puesto que los restantes requisitos del tipoconcurren, es decir la falta de consentimientoy el uso de terminal de telecomunicaciones,que tal es el servidor de comunicaciones deltitular, pues el único intermediario entre éstey el exterior.

La evaluación del daño emergente, esdecir el causado al propietario del terminalpor el ancho de banda utilizado sin autori-zación, es el camino correcto, pero tambiénde escaso resultado. Al precio actual de losabonos, llegar a acreditar un uso equivalen-te a 400 Euros puede ser no sólo complejo,sino dificultoso.

La alternativa más adecuada es evaluar ellucro cesante, especialmente en aquellasempresas para las que Internet es su mercado,único o relevante. Por ejemplo, las agencias deviajes, las empresas de comercio electrónico yaquellas otras en las que una parte de su nego-cio tiene lugar a distancia y mediante la red.Es evidente que el hecho de que un intrusoirrumpa en su red y ocupe una parte de su

ancho de banda, supone que un número inde-terminado de clientes no podrá acceder a lapágina Web del comerciante y, en consecuen-cia, éste perderá el negocio que tales clienteshabrían generado. Si a ello sumamos un hecho,tan evidente como constatado, como es quepara el consumidor que compra por Internet

dos de los factores determinantes de su elec-ción son, más allá del precio, la disponibilidadveinticuatro horas al día y la rapidez de las tran-sacciones, es evidente que en un mundo deamplia oferta, la demanda de los clientes queno pudieron acceder por estar una parte delancho de banda ocupado por el intruso, se deri-vará a otros comerciantes. Con lo que eldefraudado será perjudicado en el importe delnegocio potencial que acredite haber perdido.Acreditación que no presenta dificultad exce-siva para cualquier abogado con un mínimode experiencia en la materia.

El recurso a calificar la conducta comofalta, por la reducida entidad económica biende la defraudación, bien del daño, no esmenos problemático, dada la dicción delnúmero 4 del artículo 623, pues se refiere adefraudación “en equipos terminales de tele-comunicación”. Determinar qué debe enten-derse por tal defraudación no es sencillo,pues no se dice que el objeto del ilícito sea

ni el uso ilegítimo del fluido, ni tampoco elinconsentido del terminal, lo que puede daren la impunidad de la conducta, aun reco-nociendo su ilegalidad.

En algunos medios se ha señalado la posi-bilidad de incardinar estas intrusiones en elmarco del número 4 del artículo 286, peroaquí el punto de colisión sería el hecho de quela tecnología empelada no tiene como obje-to la intrusión, sino que la misma es posiblepor la concurrencia de una tecnología neu-tral (la que posibilita el acceso a las redes wifi),una conducta determinada del intruso y otrapoco diligente del titular. Y sin la coinciden-cia de estas dos, la tecnología es neutral.

Es evidente que la adopción de medidasde seguridad debe ser la norma de quienesquieran instalar redes wifi empresariales, yaún domésticas, pero ante la acción inten-cional o derivada del fallo propio de seguri-dad, una alternativa es la persecución en el

ámbito penal. Persecución que, como que-da dicho, presenta dificultades, especialmenteen el campo de la prueba del daño al perju-dicado, pero también es cierto que cuantoantes se inicie, antes se desincentivarán estetipo de conductas. Una de cuyas consecuen-cias es el daño económico directo a aquellaparte del negocio del perjudicado que dis-curre por Internet, pero no el único.

Por no referirnos a aquellos casos en losque el acceso fraudulento no se produce conla intención de aprovechar un recurso dis-ponible, que, por cierto, y como hemos vis-to, no debe entenderse como tal, sino paraalcanzar otros objetivos, desde la ilegal pues-ta a disposición de terceros de música o pelí-culas, hasta la difusión de otro tipo de con-ductas que inciden, per se, en el ámbito de lopenal. Conductas defraudatorias de las queaparecerá como responsable, al menos enprimera instancia, el propio perjudicado dela intromisión.

dotN

etM

anía

<<

47

dnm.legal<<

Es evidente que quien accede a una red de comunicaciones sin estar autorizado, y emplea una parte del ancho de banda para su propio beneficio,

está realizando una conducta antijurídica.

<< MVP Online de este mes, he creído convenienteofrecer a los lectores una contribución que más que apor-tar funcionalidad a nuestros desarrollos de aplicacionesWeb con ASP.NET, nos ofrece la posibilidad de mos-trar una interfaz más agradable a nuestros sitios Web,un aspecto éste, que en muchas ocasiones y según cuá-les, es casi más importante que la propia funcionalidadde la aplicación.

En no pocas ocasiones, nos cansamos de ver quedeterminados controles Web poseen un aspecto tos-co. Los bordes de estos controles son ásperos y siem-pre terminan en un vértice puntiagudo en sus extre-mos, y por ello, en algunas ocasiones, nos encontra-mos con la necesidad de que un determinado controlposea una aspecto mucho menos rectilíneo y muchomás redondeado. En este caso en concreto me estoyrefiriendo al control Web Panel de ASP.NET que sir-ve de contenedor de otros controles más.

Por lo general, en nuestros desarrollos utilizamoscontroles en forma de cajas o tablas en las que inserta-mos otros controles, por eso, imagínese la posibilidadde crear cajas con bordes redondeados dentro de las cua-les insertar nuestros controles y dar así, un aspecto muchomás atractivo a nuestras aplicaciones. Bueno, al menosimagíneselo, porque hasta ahora, con ASP.NET no esposible de forma directa... ¿o debo decir mejor dichoque no era posible?. Veamos lo que nos sacaremos de lachistera en esta sección este mes.

Iniciándonos en la creación de bordesredondeados

Antes de nada, comentar que si deseamos crearbordes redondeados para aplicarlos a nuestras pági-nas web, debemos diseñarlos primero con un pro-grama de dibujo, combinando y guardando la gamade colores adecuada e insertarlos después en nuestraspáginas Web.

Para facilitar esta tarea, utilizamos las hojas deestilo o CSS (Cascading Style Sheets). De esta manera,podremos añadir estilos a los controles Web de unaaplicación.

Se trata de un trabajo mucho más manual queautomático, y requiere de excesivo tiempo y dedica-ción. Además, cualquier pequeña modificación en elaspecto que se le quiere dar, significa un trabajo de

mantenimiento bastante grande. Aún así, no todoslos navegadores Web lo soportan completamente, yes por eso que entra en juego el ingenio de un desa-rrollador independiente como lo es Scott Mitchell,MVP de ASP.NET y que en este caso, ha desarrolla-do un control de nombre RoundedCorners que no esotra cosa que un control web tipo caja, que nos ofre-ce la posibilidad de crearlo con un aspecto mucho másatractivo.

RoundedCorners, redondeando las esquinas

El objetivo del control RoundedCorners, es el depreparar y crear bordes redondeados a un control tipocaja; todo ello, haciéndolo on fly, es decir, al vuelo. Lamecánica de funcionamiento es muy simple: cuandoejecutamos nuestra página Web se generarán los bor-des redondeados sino se han creado ya previamenteen otra ejecución y se mostrarán en el navegador deforma rápida.

Esto lo consigue Scott utilizando las capacidades queofrece GDI+ y de esa manera, que RoundedCorners seencargue de generar automáticamente las esquinasredondeadas de un control si no están creadas ya.

Esta generación se realiza en el servidor, y el clien-te, tan solo recibe las imágenes que debe acoplar enlas esquinas del control tipo caja como si estuviéra-mos usando CSS. La habilidad del desarrollador, resi-de en este caso, únicamente en saber el aspecto visualque se le quiere dar a la página para que ASP.NET,lo prepare y lo muestre correctamente.

Como vemos, este control es además el que seencarga de generar los bordes que necesitamos, conel color de borde y de fondo que le hemos pedido,por lo que nos podemos olvidar de la tediosa tarea decrear nosotros mismos esos bordes y tratar de cua-drarlos en nuestras páginas web y de ejecutar nues-tra aplicación y observar si el aspecto dado es el quebuscábamos. Parece útil ¿verdad?

RoundedCorners,algunas característicasque debemos conocer previamente

Antes de abordar nuestro ejemplo práctico coneste control, creo conveniente hacer un repaso gené-

En la sección

Jorge Serrano

dnm.mvp.online<<

Creación de bordes redondeados enWebForms: RoundedCorners

dotN

etM

anía

<<

49

dnm.mvp.online<<

rico por las características generales que este com-pleto control nos ofrece.

En primer lugar, el código fuente del control estádisponible gracias a que su autor, Scott Mitchell hadecidido compartirlo con todo el mundo. El ensam-blado compilado PrettyUI.dll está compilado conMicrosoft Visual Studio .NET 2003. Si desea utili-zarlo con ASP.NET 1.0, deberá compilarlo conMicrosoft Visual Studio .NET 2002 para usar suensamblado.

El control se añade a la barra de herramientascomo haríamos con cualquier otro control que noestuviera allí. Para insertar el control a nuestras pági-nas Web, bastará con pinchar sobre el control en labarra de herramientas y hacer doble clic sobre el con-trol o arrastrar y soltarlo sobre la página Web.

El aspecto o propiedades del control insertado den-tro de nuestra página Web, tiene su fiel y automáticoreflejo dentro de ésta en tiempo de diseño. Cuandomodificamos una propiedad en tiempo de diseño enVisual Studio .NET, se muestra directamente el aspec-to que tomará en tiempo de ejecución.

Otro aspecto importante a tener en cuenta a lahora de trabajar con este control, es la generación deimágenes o bordes redondeados en tiempo de ejecu-ción. Esta generación se hace sobre un directorio vir-tual o un directorio determinado sobre el cuál le hemosdado los permisos necesarios para generar imágenes.Los permisos que debemos habilitar son los de escri-tura sobre el directorio. Además, debemos asegurar-nos que el usuario ASP.NET tiene permisos sobre estedirectorio, en caso contrario, no seremos capaces decrear las imágenes en tiempo de ejecución y ASP.NETnos indicará con un error, que no puede mostrar lapágina Web.

Sobre las propiedades de este control, reflejare-mos algunas de las más importantes para que tenga-mos alguna idea o noción previa sobre el control,antes de ponernos a trabajar de lleno con él. Entre

estas propiedades encontramos la propiedadBackColor que como su propio nombre indica, con-tiene el valor del color de fondo del control. Ademásde esta propiedad, el control puede tener un colorde borde, un tamaño y un estilo; esto lo consegui-mos con las propiedades BorderColor, BorderWidth yBorderStyle respectivamente. El tamaño del con-torno redondeado puede ser especificado con las pro-piedades CornerHeight y CornerWidth que especificael ancho y alto de los bordes redondeados. Su tama-ño por defecto es de 13 píxeles.

Por otro lado, el control también nos permitecrear un título sobre el cual podemos modificar unamplio conjunto de propiedades. Una propiedadfundamental para este control es la propiedadImageDirectory, la cuál nos indica el directorio sobreel cual el control generará las imágenes bajo deman-da. Otra propiedad muy interesante es la propie-dad Padding que nos indica el relleno alrededor deltexto del control. No menos interesante es tambiénla propiedad RoundedBottom que determina si en laparte inferior del control, queremos mostrar o nobordes redondeados. Por defecto, su valor es Trueque indica que la parte inferior del control debegenerar bordes redondeados. Existen otras muchaspropiedades, pero éstas son quizás las más genéri-cas y relevantes en una fase inicial. Al final del artí-culo comento otra de sus propiedades; lo hago apar-te por tratarse de una propiedad especial de aspec-to avanzado.

RoundedCorners,una imagen vale másque mil palabras

Ha llegado la hora de dejar de lado la teoría y poner-la en práctica con un ejemplo que nos muestre cómo fun-ciona este control en nuestros desarrollos.

En nuestro ejemplo práctico, iniciaremos un nuevoproyecto de aplicación Web en ASP.NET 1.1.Añadiremos el control RoundedCorners a nuestra barrade herramientas e insertaremos un control dentro de lapágina Web, tal y como se muestra en la figura 2.

Figura 1. Selección del control PrettyUI.dll para insertarloen la barra de herramientas

Figura 2. Control RoundedCorners insertado en la página Web

En este punto, le recomiendo jugar con las pro-piedades del control, recordando que la propiedadImageDirectory debe tener un directorio que tengapermisos de lectura y escritura para un usuarioASP.NET válido.

Inserte un control RoundedCorners y modifiquealguna de sus propiedades. Un ejemplo en ejecuciónde este control es el que se muestra en la figura 3.

Ahora bien, este control nos permite muchasmás posibilidades, como la de ser contenedor deotros controles.

RoundedCorners como contenedor deotros controles

En este caso en concreto, RoundedCorners nosproporciona todas las posibilidades para ser un con-tenedor de otros controles como lo ofrecen tam-bién otros de ASP.NET.

El siguiente ejemplo, nos muestra a RoundedCornersen acción, siendo contenedor de un control DataGrid.

El código de nuestro pequeño ejemplo con acce-so a base de datos incluida es el que se detalla en elfuente 1.

Dentro del formulario Web hemos insertado doscontroles RoundedCorners y dentro de uno de ellos (elprimero de los dos), hemos insertado el controlDataGrid. Para que nos hagamos una idea más clara, lafigura 4 aclarará estos términos. A los controlesRoundedCorners, le he modificado algunas de sus pro-piedades. Le recomiendo que haga lo mismo para quevea el alcance de este control.

En ejecución nuestro pequeño ejemplo de demos-tración, es el que puede verse en la figura 5.

dotN

etM

anía

<<

50

dnm.mvp.online<<

Private Sub Page_Load(ByVal sender As System.Object, _

ByVal e As System.EventArgs) Handles MyBase.Load

Dim strConexion As String

Dim objConexion As OleDb.OleDbConnection

Dim objComando As OleDb.OleDbDataAdapter

Dim objDS As New DataSet

strConexion="PROVIDER=MICROSOFT.JET.OLEDB.4.0;DATA SOURCE=c:\Ejemplo.mdb"

objConexion = New OleDb.OleDbConnection(strConexion)

objComando = New OleDb.OleDbDataAdapter(_

"SELECT Nombre, Apellidos FROM Tabla", strConexion)

objComando.Fill(objDS, "Ejemplo")

DataGrid1.DataSource = objDS.Tables("Ejemplo")

DataGrid1.DataBind()

objConexion.Close()

End Sub

Fuente 1

Figura 3. Control RoundedCorners en ejecución

Figura 4. Controles RoundedCorners insertadosen el formulario Web

Figura 5. Aplicación en ejecución con los controlesRoundedCorners vistos en la figura 4

Los formularios Web trabajan desco-nectados del servidor, y cada vez quevamente, se rearma el contenido, se

envía al cliente, y se dispone de todos

Mejorando los bordes en el controlRoundedCorners

A continuación. y por eso lo he hecho en un pun-to aparte, me gustaría hablar del efecto anti-aliasingo de evitar la separación de líneas y curvas al pintar.Este efecto, es el que permite suavizar las curvas ybordes en su parte más áspera, dando así un aspectomucho más visible y estético.

Esto se consigue en este control, haciendo usode la propiedad BackgroundBackColor. Esta propie-dad contendrá el valor de fondo que permitirá sua-vizar las curvas al usar este control. Por lo general,el color de este control debe ser el mismo que el delfondo sobre el que está situado. En una página Webcualquiera, el color debe ser el mismo que el colorde fondo de ésta. Es importante indicar su color aun-que éste sea el color por defecto de la página Web.

Un ejemplo gráfico de la diferencia de uso de estatécnica y el uso por defecto del control que no utilizaesta técnica, es la que se muestra en la figura 6.

Conclusión

En este artículo, hemos podido ver el funciona-miento de un control como RoundedCorners, que nosofrece la posibilidad de crear cajas contenedoras conbordes redondeados.

La posibilidad de obtener el código fuente delcontrol, y que así podamos, si el autor nos lo per-mite, retocar el control para añadirle o modificar-le diferentes propiedades, es otra de las ventajasque nos proporciona RoundedCorners.

El código fuente e información adicional sobre el con-trol, lo encontrará en los siguientes enlaces Web, que lerecomiendo visitar:

dotN

etM

anía

<<

51

dnm.mvp.online<<

Figura 6. Diferencias de uso de suavizado de bordes con el control RoundedCorners

Los formularios Web trabajan desco-nectados del servidor, y cadadel servi-dor, y cadadel servidor, y cada vez que

vamente, se rearma el contdel servidor,y cadadel servidor, y cadaenido, se envía

al cliente, y se dispone de todos

Direcciones de interés

Introducing the RoundedCorner Web Controlhttp://aspnet.4guysfromrolla.com/articles/072804-1.aspx

RoundedCorners Web Control Demohttp://datawebcontrols.com/demos/RoundedCorners.aspx

Improving the RoundedCorners Web Controlhttp://aspnet.4guysfromrolla.com/articles/081104-1.aspx

El currículum de Scott esbastante amplio, pero a gro-so modo, diremos de él quereside en San Diego,California. Es MVP enASP.NET desde el año 2002,editor y primer responsabledel conocido sitio webwww.4GuysFromRolla.com ydurante los últimos cincoaños ha estado trabajando con

tecnologías Web de Microsoft. Profesionalmentees un consultor independiente, es también autorde seis libros sobre ASP.NET y XML, escritorhabitual de publicaciones técnicas como ASP.NETPro Magazine y MSDN Magazine, y en sitios Webcomo MSDN, Web Monkey y 15Seconds.com.También ha sido ponente en varias conferenciase imparte formación sobre ASP.NET y serviciosWeb principalmente.

Para más información sobre Scott consultar:http://www.4guysfromrolla.com/ScottMitchell.shtml Oen su blog: http://ScottOnWriting.NET.

Podrás contactar con él en la dirección de [email protected].

Si quieres saber más sobre el programa MVP pue-des consultar la página oficial de Microsoft en:http://mvp.support.microsoft.com

Sobre Scott Mitchell

Scott Mitchell

Diálogo concerniente a los principales siste-mas mundiales y sus diseños arquitectónicos

orientada a servicios (SOA) plantea aparente-mente un concepto similar que, en ocasiones, es inco-rrectamente interpretado como una consecuencia de losservicios Web en .NET. ¿Cuál fue primero: el huevo deSOA o la gallina de los servicios Web?

El título de esta columna, deliberadamente hacereferencia al libro escrito por Galileo Galilei, astró-nomo y físico del siglo XVII. Galileo tuvo serios pro-blemas con la Iglesia católica debido a su apoyo dela Teoría Heliocéntrica, según la cual es la Tierra laque gira alrededor del Sol y no viceversa. ¿Quiéndaba vueltas alrededor de qué? La pregunta me vinoa la mente cuando abrí el correo para la columna deeste mes.

Comprender la correcta relación entre los serviciosWeb, tales como los conocemos de las arquitecturas J2EEy .NET, y la arquitectura SOA es un factor clave en eldiseño de arquitecturas distribuidas que funcionen tan-to hoy como mañana, cuando Índigo haga su debut elpróximo año. (A propósito, la primera beta pública deÍndigo se espera para este Otoño).

Oigo a muchos ponentes hacer uso del térmi-no SOA en sus charlas para promocionar el usode servicios Web en aplicaciones distribuidas.¿Deberíamos abandonar las prácticas orientadasa objetos para escribir servicios Web y utilizarXML en todas partes? ¿Y qué pasa con las aplica-ciones locales? ¿Habría que utilizar servicios Weben todas partes?

Sólo el texto de la pregunta me recuerda a Galileo.Existe un extenso malentendido en el texto que la lite-ratura acerca de los servicios Web, inconscientementeha alimentado. La arquitectura SOA pretende obtenerenlaces débilmente vinculados entre los componentesque interactúan en la solución. Un sistema basado enSOA construye su funcionalidad en forma de servicios.¿Qué es un servicio? Puede describirse como una uni-dad funcional suministrada por un proveedor. Ambos,proveedores y consumidores, exponen un bien cono-cido conjunto de interfaces y se comunican a través demensajes descriptivos regidos por un esquema. El esque-ma dicta qué palabras y sintaxis son aceptables y no haycomportamiento implícito del sistema en los mensa-jes. Tenemos ejemplos de servicios por donde quieraque vayamos. Por ejemplo, podemos seleccionar la for-ma de recibir las noticias de una serie de canales dis-tintos de televisión, cada uno de ellos ofreciendo dis-

Dino Esposito

dnm.todotnet.qa

<< La arquitectura

Dino Esposito es redactor de dotNetManía.

Formador, consultor y escritorafincado en Roma.Miembro delequipo de Wintellect,Dino está

especializado en ASP.NET yADO.NET.

Puede enviarle sus consultas [email protected]

Hoy,la mayor parte de los responsables de IT tienen que elegir entre dos sistemas prin-cipales: J2EE y .NET.No importa lo difícil que sea la elección,es importante tener claraslas implicaciones de la decisión tomada. Desgraciadamente, ninguna aplicación es unaisla, como dijo Don Box en el PDC de 2003. Eso significa que todas las aplicacionespueden llegar a necesitar comunicarse con otros sistemas existentes a través de pro-tocolos estándar. Los servicios Web son una opción que, aunque totalmente indepen-diente de Microsoft y la plataforma .NET, comenzaron a tener la atención debida sola-mente cuando Microsoft consiguió popularizar un mecanismo fácil para su creación.

Deberíamos abandonar las prácticas orientadas a

objetos para escribir servicios Web y utilizarXML en todas partes

¿?

tintos niveles de calidad, diferentes formatos, diferen-tes presentaciones, pero el mismo servicio esencial:mantenernos informados.

El diseño de un sistema basado en estos principiostiene inherentes ventajas. Por un lado, consumir unservicio es, normalmente, más barato que construir-lo. Además, los servicios pueden reemplazarse a volun-tad. La complejidad de cara a los usuarios es mínima,ya que no necesitan saber nada de emisiones de TV,antenas, o de la estructura interna de un receptor detelevisión.

¿Cuál es la relación entre un servicio y un servicioWeb? Un servicio Web es un servicio SOA con unaserie de restricciones. Por ejemplo, un servicio Webse estructura mediante interfaces que usan protoco-los de Internet (HTTP, FTP, SMTP) y requiere quelos mensajes intercambiados se basen en SOAP. Enresumen, un servicio Web es un caso especial de ser-vicio SOA. Un aplicación compatible con SOA pue-de utilizar servicios Web.

¿Deberíamos utilizar servicios Web en todas partes?Sí, si es posible. Las modernas aplicaciones distribuidasestán orientadas a servicios en sus puntos límite y pue-den utilizar servicios Web para conectar sus componen-tes. ¿Cuál es el rol de la OOP en este escenario?

SOA y OOP son polos opuestos. En cierto modo,SOA es la reacción a algunas malas prácticas de dise-ño que han afectado a las aplicaciones distribuidasdurante años. OOP trata de la encapsulación de lalógica y la interfaz en un único componente. SOA esmás bien lo opuesto. SOA pretende conseguir la sepa-ración (o al menos la vinculación débil o ligera) entrela lógica y la interfaz. La OOP es excelente dentro delcódigo de la aplicación, SOA lo es en sus puntos lími-te. Cada uno de ellos es útil y de gran ayuda, pero enel momento adecuado y en el sitio adecuado.

No debiéramos pensar en los servicios Web comoinstancias de componentes remotos, una especie deCOM+ basado en HTTP, pero simplificado. El dise-ño debería evitar la instanciación directa o la toma decontrol sobre los componentes remotos. Una vez queoptamos por un diseño SOA podemos utilizar técni-cas OOP para la implementación del servicio. La OOPes excelente si nos limitamos a la implementación deun servicio o componente en particular, pero no lo escuando se trata de hacer que los componentes se comu-niquen entre sí.

¿Un ejemplo rápido? Imagine a sus hijos pidien-do un DVD de “Los Increíbles”. Usted les compra elDVD y listo, ¿no? Ni se le pasa por la cabeza com-prar un nuevo dispositivo que sólo sirva para repro-ducir esa única película, aunque pudiera, potencial-mente, ser configurado o modificado electrónicamen-te para reproducir otros discos.

De vuelta a la analogía de Galileo, en el mundoreal las cosas funcionan de acuerdo con los principiosestablecidos por SOA y forzarlos a comportarse al esti-lo OOP puede ser tan incongruente como la visiónheliocéntrica del mundo vs. la antropocéntrica delsiglo XVII.

¿.NET Remoting es una buena opción para laimplementación de sistemas distribuidos hoy endía? ¿No es más recomendable utilizar serviciosWeb? ¿Y qué pasa con Índigo? He oído que noexistirá más soporte para .NET Remoting en elfuturo, tanto de .NET como de Windows.

En general, .NET Remoting es solamente una delas opciones disponibles a la hora de construir un sis-tema distribuido. Existen diferentes aproximacionesposibles, cada una con sus pros y sus contras. Son:Remoting, Web Services, Enterprise Services (o sea,COM+), Message queuing, sockets TCP de bajo nivel ynamed pipes, y productos de terceros, tales comoZeroC's Ice (Internet Communications Engine) oRemoting.CORBA.

El factor clave acerca de .NET Remoting es quesirve, exclusivamente, para interacciones entre com-ponentes .NET. Remoting permite extender los lími-tes impuestos por los dominios de aplicación (App-Domains), ya sea entre el mismo proceso, procesos dis-tintos o máquinas diferentes.

No puede usarse .NET Remoting para la comu-nicación con una aplicación Visual Basic 6.0 o un obje-to COM, tanto si está en la misma máquina como sise encuentra en otra. Si nuestra aplicación se prestabien para el uso de .NET Remoting, quizá debería-mos de contrastar la solución planteada con todo elmontón de requerimientos y prerrequisitos necesa-rios en su implementación para hacernos una idea desu rendimiento y escalabilidad finales. Por ejemplo,deberíamos usar un canal HTTP con un BinaryFormatter, para obtener un buen balance entre com-

dotN

etM

anía

<<

53

dnm.todotnet.qa<<

La OOP es excelentedentro del código de laaplicación, SOA lo es en

sus puntos límite“

”.NET Remoting es unabuena opción para la

implementación de siste-mas distribuidos hoy en día

¿ ?To

do

tNet.

qa@

do

tnetm

an

ia.c

om

.To

do

tNet.

qa@

do

tnetm

an

ia.c

om

pactación de datos y estabilidad. Es más, al analizarun sistema distribuido desde el punto de vista de .NETRemoting, nos imaginamos objetos planos, solo quehabitando en otro dominio de aplicación.

Como puede verse, este modelo no es particu-larmente “moderno”, desde el momento en queestablece vínculos consistentes (tightly coupled) entrelos consumidores y los servicios. Una aproximacióninteligente a las aplicaciones con .NET Remotingconsiste en un diseño de acceso remoto a las clasescomo métodos de servicios Web sin mantenimien-to de estado. Es mejor no asumir ningún estado, yusar los métodos como desencadenantes de proce-sos y solicitudes de servicio a componentes de ser-vidor. Los servicios Web son perfectos cuando senecesita conectar aplicaciones ejecutándose bajodistintas plataformas, o cuando llegamos a la con-clusión de que los mensajes basados en XML es sim-plemente lo que se necesita.

De todas formas, como dije anteriormente, losservicios Web son… eso, servicios, principalmen-te especializados en operar mediante un conjuntode protocolos de Internet. Un diseño basado enSOA parece la clave estos días para obtener aplica-ciones distribuidas escalables y conectadas median-te vínculos ligeros. Los servicios pueden ser cual-quier cosa, incluidas las conexiones tipo .NETRemoting, servicios Web o componentes de colasde mensajes.

¿Qué es lo que nos depara el futuro inmediato?Índigo es una nueva generación estructuras de comu-nicación construida alrededor de la arquitectura deservicios Web. Está basada en un modelo de progra-mación orientado a objetos y construida mediante.NET Framework para unificar un amplio abanico detecnologías de sistemas distribuidos dentro de unaarquitectura basada en componentes y extensible. Laestructura interna de Índigo, abarca transporte, segu-ridad, mensajería, codificación, topologías de red, ymodelos de alojamiento. En suma, Índigo es una nue-va forma de construir la siguiente generación de apli-caciones distribuidas.

¿Y qué pasa con las aplicaciones actuales?Continuarán ejecutándose –así que no se preocu-pe– y la migración, en la mayor parte de los casos,no supondrá un gran esfuerzo. Índigo no malgas-tará su código actual, independientemente de la tec-nología empleada –ya sean servicios Web ASP.NET,.NET Remoting o Enterprise Services–. ¿Quépodemos hacer hoy al diseñar los sistemas para pre-pararlos adecuadamente para Índigo? Construir uti-lizando servicios Web ASP.NET y utilizar la libre-ría de extensiones de servicios Web (WSE 2.0) parala seguridad, autenticación, y otras característicasextendidas. Si necesita llamadas a transacciones den-tro de un servicio, puede utilizar EnterpriseServices. Para la programación remota no transac-

cional, .NET Remoting es una opción válida.Finalmente, la mensajería asíncrona debería imple-mentarse usando la interfaz .NET para MSMQ, osea, las clases pertenecientes al espacio de nombresSystem.Messaging. Para el resto de protocolos, Índi-go suministra claras vías de migración. Tambiénpodrían utilizarse otros medios y mecanismos detransporte, pero la migración no resultaría taninmediata.

En mi servicio Web, necesito determinar siel cliente que intenta ejecutar un método Webtiene permiso para hacerlo. Para simplificarlo,elegí la clásica solución basada en cabecerasSOAP y se me ocurrió otra idea: rediseñé el ser-vicio Web para usar la dirección IP del clientepara la autenticación. ¿Cuáles son los proble-mas potenciales al hacerlo de esta forma?Funciona muy bien, pero temo haberme olvi-dado de algunos peligros eventuales.

Así que tienes una base de datos donde guardaslas IP de los clientes que tienen permiso para eje-cutar servicios Web. Entiendo que, cuando un clien-te ejecuta un método, el servicio comprueba en labase de datos la existencia de la IP, y habilita la eje-cución. La mecánica es prácticamente la misma quela basada en la autenticación mediante nombre ycontraseña, pero me temo que deja un espacio extraa atacantes potenciales. Desde luego, no estásenviando el nombre y contraseña por la red, perola información que utilizas en la autenticación estexto plano (la dirección IP) y disponible para cual-quier sniffer. ¿Tienes la seguridad de que no hayningún hacker que pueda tener acceso a la red yenvíe IP's modificadas?

Con seguridad, el funcionamiento será bueno, perocualquier usuario (de una IP válida) podría legítima-mente llamar a tu servicio. Probablemente, esto nosea una amenaza seria en tu contexto de trabajo, pero,hablando en general, suena como una puerta abierta.Si no te gustan las cabeceras SOAP, puedes utilizarautenticación Windows, y dar a cada usuario autori-zado una entrada en la ACL (Access Control List) de lamáquina que ejecuta el servicio.

dotN

etM

anía

<<

54

dnm.todotnet.qa<<

En mi servicio Web, necesi-to determinar si el clienteque intenta ejecutar un

método Web tiene permi-so para hacerlo...

¿?

To

do

tNet.

qa@

do

tnetm

an

ia.c

om

.To

do

tNet.

qa@

do

tnetm

an

ia.c

om

dotN

etM

anía

<<

55

Web.Config Editor 2.0

Todos los programadores ASP .NET conocen la existencia del fichero web.con-fig, pero lo que ya no resulta tan sencillo es conocer todos sus elementos y saber-lo utilizar para configurar óptimamente una aplicación Web.

se trata de una herramienta para cre-ar o modificar ficheros web.config. A través de unsencillo interfaz visual podemos ir a cada uno delos nodos del fichero XML que conforma un fiche-ro web.config y administrar los parámetros a nues-tro gusto. Sin necesidad de ser un experto pode-mos modificar, de una forma visual, todos los pará-metros que nos permiten configurar una aplica-ción ASP .NET.

Además tenemos dentro del mismo interfazotras dos ventanas, como podemos ver en la figu-ra 1. En la primera ventana podemos ver el códi-go fuente de nuestro fichero web.config, resalta-do por colores cada parte de ese fichero para hacermás fácil su visualización. En la segunda ventanapodemos ver un fichero de ayuda que nos sirve paraentender y a la vez aprender más sobre el paráme-tro que estemos configurando en cada momento.

Esa posibilidad de consultar en cada momentola ayuda sobre el parámetro que estamos modifi-cando es muy interesante, ya que no solo nos sir-ve para configurar nuestra aplicación sino que tam-bién nos permitirá conocer al detalle todos los pará-metros de configuración que tenemos disponibles.Esto nos permite aprender mas sobre la configu-ración de aplicaciones ASP .NET mientras traba-jamos con Web.Config Editor.

El tratamiento que se da a cada parámetro delfichero web.config es personalizado, mostrándo-nos un interfaz visual muy amigable que nos per-mite modificar cualquier parámetro de forma sen-cilla. Por ejemplo, nos permite la posibilidad deencriptar las password en la sección de autentica-ción o si tratamos de configurar el parámetrosessionState nos mostrará una pantalla en la quepodemos introducir la cadena de conexión a la base

de datos y poder testear si esa conexión a base dedatos esta funcionando correctamente.

Todas las modificaciones que realicemos seránsiempre controladas por Web.Config Editor ya querealiza una validación automática para comprobarque nuestro fichero de configuración tiene un for-mato correcto y tiene un esquema XML válido.

Además disponemos dentro de la aplicación deuna utilidad de backup que nos permite mantenerun versionado de nuestro fichero web.config y asípoder volver a recuperar en cualquier momentoversiones anteriores.

Requisitos del sistemaLos requisitos hardware y software para insta-

lar Web.Config Editor son pocos, nos bastará concualquier ordenador en el que tengamos instaladoWindows 2000 ó Windows XP.

En la siguiente tabla podemos ver una confi-guración recomendada:

Pedro Pozo

dnm.laboratorio.net

<< Web.Config Editor

Pedro Pozoes redactor de dotNetManía. Es

es consultor e-Bussines.Ingeniero Técnico Informático

de Sistemas y Webmaster del portal para desarrolladores

.NET Framework Clikear.com

Requisitos del Sistema

Hardware Software

Pentium III 733 Mhz Microsoft InternetExplorer 5.01 o superior

256 MB memoria Ram Microsoft Windows 2000,XP ó 2003

4 MB espacio libre endisco

Web.Config Editor soporta dos modalidades detrabajo: una en modo sencillo para editar un ficherode configuración en concreto y otra en modo com-plejo para editar todos los ficheros de configuraciónque intervienen en una aplicación ASP.NET.Trabajando en modo complejo tendremos un con-trol total sobre todos los parámetros de configura-ción de una aplicación ASP.NET. De esta forma,podemos configurar desde los parámetros de confi-guración globales para todas las aplicacionesASP.NET residentes en un servidor, que están elfichero machine.config, hasta los parámetros de con-figuración concretos de nuestra aplicación que resi-den en el fichero web.config.

Cabe destacar en esta nueva versión 2.0 que han sidoañadidas 7 nuevas secciones del fichero web.config queanteriormente no aparecían y una utilidad para poderrealizar búsquedas en el código XML de los ficheros deconfiguración.

Ventajas e Inconvenientes

Web.Config Editor nos ofrece un entorno muysencillo para poder configurar nuestra aplicaciónASP .NET. Cabe destacar también la ayuda diná-mica que nos proporciona dependiendo de cadaparámetro que estemos modificando, proporcio-nándonos un mayor conocimiento acerca del fiche-ro web.config.

La facilidad de manejo, sencillez de instalacióny rápido aprendizaje son las cualidades mas desta-cadas de Web.Config Editor, pudiendo conside-rarla una aplicación de desarrollo y de autoapren-dizaje a la vez.

Entre las desventajas de Web.Config Editoresta quizá la falta de integración en entornos dedesarrollo mas complejos, como por ejemplo VisualStudio .NET.

Conclusiones

Web.Config Editor es una senci-lla herramienta para controlar hasta elúltimo detalle de la configuración denuestras aplicaciones ASP .NET. Peroademás, indirectamente nos ayudara air aprendiendo cada vez mas sobre lasposibilidades que nos ofrece el fiche-ro web.config, siendo por tanto una

herramienta que aumenta nuestros conocimientos deASP .NET.

Quizá los mas puristas prefieran modificar a manoel fichero web.config, pero para el resto esta aplica-ción nos facilitará mucho la vida y nos ahorrará tiem-po, tanto en desarrollo como en investigación paraconocer los parámetros de configuración de una apli-cación ASP .NET.

La facilidad de manejo, sencillez de instalación y rápido aprendizaje son las cualidades mas destacadas de Web.Config Editor, pudiendo

considerarla una aplicación de desarrollo y de

autoaprendizaje a la vez

Ficha técnica

Nombre Web.Config Editor

Versión 2.0

Fabricante HunterStone

Web http://www.hunterstone.com/webconfig.asp

Categoría Herramientas de desarrollo

Licencias Precio

Hasta 5 99$ por usuario

Hasta 10 89$ por usuario

Más de 10 79$ por usuario

Valoración

Figura 1.Web.Config Editor 2.0

<< dnm.laboratorio.net

56

<<do

tNet

Man

ía

dotN

etM

anía

<<

57

<<

Introducing Microsoft .NETDavid Platt

Editorial: Microsoft PressISBN: 0735619182Páginas: 329Publicado: Mayo, 2003

Esta introducción es una revisión aumentada y corregida para .NET 1.1, de su ante-rior “Así es Microsoft .NET”, salteada de los brotes humorísticos muy especiales deDavid Platt, autor conocido también por otras obras como “The Essence of COMand ActiveX: A Programmers Workbook”, o “Understanding COM+”. Se trata de unaintroducción, simplemente. Nada es tocado en profundidad, pero nada importante dejade comentarse de forma suficiente, desde las aplicaciones Windows y Web hasta la ges-tión de ficheros XML, la programación de subprocesos, y .NET Remoting.

Como Platt utiliza Visual Basic .NET en sus ejemplos, podría servir de excelente intro-ducción a los programadores de VB6 en fase de migración o incluso también a pro-gramadores de Java que tengan que abordar nuevos desarrollos con este lenguaje.

Inside Microsoft Visual Studio .NETBrian Johnson, Craig Skibo,Marc Young

Editorial: Microsoft PressISBN: 0735618747 Páginas: 519Publicado: Febrero, 2003

Una obra no muy común, en cuanto que va más dirigida a la herramienta que a laplataforma. No obstante, conviene que el lector interesado la vea como “El librode la extensibilidad de Visual Studio .NET”, en lugar de atenerse a su título estric-to. Es de lo que trata: de la construcción de complementos (Add-ins), y módulos deextensibilidad para Office desde Visual Studio .NET 1.1, pero con más detalle yprofundidad de lo que hayamos visto en ninguna obra anterior.

En la primera parte, se analizan la gestión de proyectos, el editor de código y eleditor de macros. En la segunda –la más extensa–, todo sobre la construcción decomplementos, la programación de asistentes y el modelo de código, y, en la par-te final, se agradecen detalles exhaustivos sobre la construcción de proyectos deinstalación, el uso avanzado de la ayuda y la gestión de proyectos avanzados.Recomendable bajo los supuestos anteriores.

dnm.biblioteca.net<<

dnm.biblioteca.net

Nice GUI for Windows: Es una pequeña herramienta que per-mite el control y ejecución visual de muchos de los comandostipo DOS del sistema. Se puede descargar directamente delsitio http://bink.nu/files/HHv1002.zip

Joe's Tools: Conjunto de más de 30 herramientas gratuitas paracontrol del sistema, accesibles en el sitio de Joeware:http://www.joeware.net/win/free/all.htm.

Para redes: Herramienta Microsoft para detectar si alguna inter-faz de red está ejecutándose en modo “promiscuo”. Se puedebajar desde http://www.microsoft.com/downloads/details.aspx?amp;displaylang=en&familyid=1a10d27a-4aa5-4e96-9645-aa121053e083&displaylang=en

Kit de Recursos para IIS 6.0: Asistente y varias herramientas parafacilitar la configuración del conocido servidor Web que incor-pora Windows Server 2003. Está disponible enhttp://www.microsoft.com/downloads/details.aspx?FamilyID=56fc92ee-a71a-4c73-b628-ade629c89499&DisplayLang=en

Primeras noticias sobre Windows XP Reduced MediaEdition (RME), IE7,Windows Anti-Spyware y la herra-mienta de eliminación de virusAunque Microsoft se está planteando cambiar el nombre deesta versión del sistema, cuya única diferencia respecto a XPProfessional es la ausencia de Windows Media Player, quepodrá ser instalado mediante descarga, configurando unWindows XP Service Pack 2, prácticamente idéntico al ori-ginal. Con esto se da cumplimiento a la normativa exigidapor la UE respecto a la inclusión del reproductor dentro delsistema operativo.

La noticia coincide con otros anuncios relativos a navega-dores: por un lado, el anuncio del nuevo Internet Explorer7, tal y como se recoge en el Microsoft Internet ExplorerWeblog: http://blogs.msdn.com/ie/archive/2005/02/15/373104.aspx, donde el responsable directo del productocomenta que el nuevo Explorer tiene como soporte baseWindows XP SP 2, –ya que está construido sobre los fun-damentos de esa tecnología– y que se han tenido en cuentamuchas sugerencias de los usuarios finales. Por otra parte,se anunciaba también la versión beta de Netscape Browser8.0, al tiempo que los creadores de FireFox, anuncian nue-vas “Add-ons” para el producto.

Por otra parte, la versión Microsoft Windows AntiSpyware1.0.509 Beta 1 (http://download.microsoft.com/downlo-

a d / 8 / 1 / 5 / 8 1 5 d 2 d 6 0 - 4 9 b 5 - 4 4 d c - a e 3 5 -fca2f2c6f0cc/MicrosoftAntiSpywareInstall.exe) se ha puesto adisposición de los usuarios, casi al tiempo del anuncio porparte de Redmond de la adquisición de la compañía de soft-ware de seguridad Sybari, en un claro refuerzo a la políticade aumento de seguridad que comenzó con la adhesión a lainiciativa Trustworthy Computing. Además, la denominadaherramienta de eliminación de software malintencionado deWindows, también está disponible para descarga en la direc-ción: http://www.microsoft.com/spain/technet/seguridad/herra-mientas/msrtool.mspx

Se confirma la aparición de la primera beta de Longhornpara junio de este año

Así parece, finalmente, según confirma el artículo publi-cado en ZDNews (http://news.zdnet.com/2100-9593_22-5566423.html), en el que John Montgomery, Directoren la Microsoft Developer Division lo comentaba en unaentrevista en el pasado evento VSLive (http://www.ftpon-line.com/conferences/vslive/2005/sf/). La release será funda-mentalmente para desarrolladores, por lo que no seríade extrañar que, de alguna forma se integrara finalmen-te con la beta 2 de Visual Studio 2005, permitiendo pro-barlo de forma más directa. Montgomery añadía quemuchas de las novedades son meramente de mejoras ope-rativas (de manejo) del sistema, incluyendo un nuevomodelo de drivers. De pasada, se confirmaban las salidasde Visual Studio 2005 y SQL-Server 2005 para despuésdel verano, así como betas posteriores de Longhorn (2)a lo largo de la segunda mitad del año actual, y una nue-va CTP (Community Technology Preview) de Avalon, parael mes de marzo.

dotN

etM

anía

<<

58

no

ticia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s

Utilidades recomendadas

dnm.desvan<<

Marino Posadas

Introducción a C-Omega, Estupendo artículo del especialista enXML Dare Obasanjo, sobre el nuevo lenguaje en fase experimentalen Microsoft Research, mezcla de C#, XPath, y SQL. Visite el sitio deO'Reilly XML en: http://www.xml.com/pub/a/2005/01/12/comega.html

Documentos en la Red

Sit ios Web del mes

On DotNet:C#, F#, J#: Sitio Web de la editorial O'Reilly, con artículos sobrelos lenguajes Sharp (#): http://www.ondotnet.com/topics/dotnet/csharp.net

PDC Talks:Fundamentals: sitio Web de Microsoft que aglutina algunas de lasconferencias dictadas el pasado PDC, que incluye artículos y ficheros PowerPoint.http://msdn.microsoft.com/Longhorn/PDCMaterials/PDCTalksFundamentals/default.aspx

Valil.Chess: Detalles de funcionamiento, código fuente y ejecutable de un juego deajedrez realizado integramente con Visual C# 2005 Express Edition Beta. El motor deejecución está portado directamente del Java Chess Engine. Disponible en http://www.code-project.com/csharp/chess.asp

IMPORTES VÁLIDOS HASTA NUEVA OFERTA

DATOS DE FACTURACIÓN

CIF/NIF . . . . . . . . . . . . . . . . . . . . .Empresa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Nombre y apellidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Dirección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Población . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Código Postal . . . . . . . . . . . . . . . . . . . Provincia . . . . . . . . . . . . . . . . . . . . . . . . .Teléfono . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fax . . . . . . . . . . . . . . . . . . . . . . . . . . . email . . . . . . . . . . . . . . . . . . . . . . . . . . . .

DATOS DE ENVÍO (sólo si son distintos de los datos de facturación)

CIF/NIF . . . . . . . . . . . . . . . . . . . . .Empresa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Nombre y apellidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Dirección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Población . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Código Postal . . . . . . . . . . . . . . . . . . . Provincia . . . . . . . . . . . . . . . . . . . . . . . . .Teléfono . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fax . . . . . . . . . . . . . . . . . . . . . . . . . . . email . . . . . . . . . . . . . . . . . . . . . . . . . . . .

FORMA DE PAGO

❑ Talón nominativo a nombre NETALIA, S.L.❑ Transferencia bancaria a nombre de NETALIA, S.L. a:

La Caixa - Número de cuenta 2100 4315 48 2200014696 (Indique su nombre en la transferencia)

❑ Domiciliación Bancaria (con renovación automática, previo aviso)Indique su número de cuenta:

❑ Tarjeta de crédito❑ VISA ❑ MASTERCARDNúmero de su tarjeta: Fecha de caducidad: / (imprescindible)

Firma y/o sello (imprescindible)

a de de 200

Suscripción a dotNetManía

Usted autoriza a la mecanizaciónde estos datos. El responsable ydestinatario de éstos es Netalia,S.L. Usted tiene derecho a acce-der a sus datos, modificarlos ycancelarlos cuando lo desee. Susdatos no serán cedidos en nin-guna de las formas posibles a ter-ceras partes y no se utilizaránmás que para el buen funciona-miento de su suscripción a larevista dotNetManía y parainformarle de las actividadescomerciales que realice la edito-rial Netalia, S.L. Si no desearecibir información comercial dedotNetManía marque la casillasiguiente ❑

❑ Nº9 ❑ Nº11 ❑ Nº12

Puede enviar los datos al email [email protected],al FAX (34) 91 499 13 64 o al teléfono (34) 91 666 74 77.

También puede enviarlo por correo postal a la siguiente dirección:

Netalia, S.LC/ Robledal, 13528529 - Rivas VaciamadridMadrid (España)

❑ Deseo suscribirme a dotNetManía por un año (11 ejemplares) y beneficiarme de la oferta del 10% de descuento por unimporte total de 60 € para España; o por 120€ para el resto del mundo (envío por avión) (IVA incluido).

❑ Deseo suscribirme a dotNetManía por un año (11 ejemplares) por un importe de 45 € por ser estudiante (IVA incluido).Aporto fotocopia del carné de estudiante o sello del centro académico (IMPRESCINDIBLE). OFERTA VÁLIDA SÓLOPARA ESTUDIANTES RESIDENTES EN ESPAÑA.

❑ Nº6 ❑ Nº7 ❑ Nº8

Si desea algún otro número indíquelo

❑ Nº10