Capitulo 18 Visual Basic

  • October 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Capitulo 18 Visual Basic as PDF for free.

More details

  • Words: 19,776
  • Pages: 47
Visual Basic - Guía del Estudiante Cap. 18 Visual Basic e Internet Internet es la tentación en la que actualmente todos los estudiantes quieren caer. Y tienen motivos para ello. Internet ofrece unas posibilidades de comunicación como nunca las ha habido, lo que brinda unas oportunidades inmensas al programador si analiza de forma pausada lo que la red le puede ofrecer. Y digo si las analiza de forma pausada porque esa tentación en la que caen todos los estudiantes es pretender crear un navegador similar al Internet Explorer o al Netescape, un correo que supere al Eudora y un programa de FTP que sea capaz de bajarle la Enciclopedia Británica en menos de media hora. Pero hay que ponerse con los pies en la tierra y comprender que esos programas llevan mucho trabajo de muchos programadores, mucho tiempo de prueba y unos medios económicos y comerciales tras ellos que hacen que esos productos tengan que ser necesariamente mejores que lo que puede hacer un estudiante, por mucho interés e ilusión que ponga. Sin embargo sí puede ser muy ilustrativo que en este curso nos propongamos la meta de hacer un programa que sea al tiempo el mejor navegador, el mejor correo (por dos procedimientos), y el mejor FTP que se pueda concebir, y encima que pueda hacer chat, ping y Telnet. Será el mejor, sin duda, porque será el único que nos permita aprender a manejar los controles que Visual Basic nos tienen reservados para los entornos IP. Nota para alumnos expertos. Si de verdad es Ud. un experto y se lo sabe todo sobre IP puede saltar directamente al tema Controles de Visual Basic para las redes IP. La colección Guía del Estudiante está escrita pensando en quien no sabe y quiere saber. Por eso no puedo pasar pos alto conceptos de nomenclatura de redes IP que se repetirán a lo largo del capítulo, y que seguro que a más de un alumno le aportarán nuevos conocimientos. Si pese a ser un experto, su humildad le aconseja leérselo, verá que a lo mejor se le aclara más de un concepto.

Redes IP. Protocolos de comunicación en redes IP Una red IP es una red de comunicación basada en la transmisión bidireccional de paquetes. Cuando decimos esto queremos expresar que la comunicación entre dos puntos de la red (entre dos ordenadores conectados a la red) no es continua, sino que la información se parte en origen en pequeños trozos que se envían por la red hasta el destino. Una vez allí, se vuelven a poner cada uno de los paquetes en su sitio para volver a formar el bloque de información que teníamos en origen. Esta técnica permite compartir al mismo tiempo los recursos de la red por muchos usuarios, sin que ninguno de ellos pueda bloquear la red por el hecho de enviar una gran cantidad de información. Cada usuario podrá enviar el mismo número de paquetes por unidad de tiempo (más o menos) por lo tanto quien deba enviar más información tardará más tiempo que otro que tenga menos información. Y todo sin llegar a bloquear la red. Eso sí, cuantos más usuarios estén presentes en un determinado momento, más lenta la veremos, ya que nos corresponderá menos número de paquetes por unidad de tiempo. El hecho de que la información original se trocee en paquetes que se envían a la red implica poner una dirección de destino a cada uno de esos paquetes (para saber a quien van dirigidos) y la dirección del origen, (para saber quien lo envía). De esta forma, la red sabe a quien debe entregar el paquete y el destino sabe de quien procede. Todo esto lo hace el protocolo IP (Internet Protocol) Esto es como si IP trabajase solamente de cartero. Coge paquetes en un buzón y los envía a su destinatario sin importarle el contenido del paquete. Luego veremos lo de la dirección. Lo cierto es que el paquete llega al destino. A este “nivel” de comunicación le llamaremos Nivel de Red. Si lo prefiere, también le puede llamar Nivel de Enlace. Es problema de terminología. No se complique la vida. Al protocolo IP le podemos denominar por tanto, Protocolo de Red. Lo que no sabe el destino es el orden en el que tiene que colocar el paquete dentro del bloque total de información. Debido a que el camino seguido por los paquetes no tiene porqué ser el mismo para todos, es posible que se reciba primero un paquete que se ha transmitido con posterioridad. Por lo tanto será necesario poder establecer el número de orden de cada uno de los paquetes dentro del grupo total de LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 1

paquetes que se han generado para la transmisión. También será necesario en ciertos casos conocer si el destino ha recibido correctamente el paquete. Estas cosas las hace el Protocolo de Transporte. El protocolo IP tiene dos protocolos de transporte: el TCP y el UDP. El TCP establece una comunicación en la que el origen envía un paquete y espera la confirmación del receptor de que lo ha recibido. Si pasa un determinado tiempo sin recibir esa confirmación vuelve a enviar el mismo paquete. Pudo haberse perdido el paquete que había enviado o también pudo perderse la confirmación. En cualquier caso el origen vuelve a enviar y el receptor puede saber perfectamente lo que ha ocurrido y colocar el paquete en su sitio si se había perdido inicialmente, o descartarlo si la repetición se ha debido a que se había perdido la contestación. Cada paquete lleva un número que indica el número de orden de ese paquete dentro del bloque total. El protocolo TCP es muy seguro. Porque además de lo expuesto, tiene un procedimiento de cálculo de una Checksum que permite saber si un paquete ha llegado sin ningún tipo de error. Si detecta error en un paquete, pide repetición. También lleva el número del puerto por el que debe entrar esa información. Verá mas adelante lo que es un puerto. Mediante el protocolo TCP podemos transportar un fichero enorme sin ningún tipo de error. Es el que se usa normalmente en las redes IP. Por cierto, ¿Sabe que significa TCP? Transmision Control Protocol , o como diría Cervantes, Protocolo de Control de Transmisión. El protocolo UDP (que significa User Datagram Protocol) o Protocolo de Datagramas de Usuario es un protocolo que envía paquetes sin esperar respuesta. No le preocupa que los paquetes se pierdan. UDP usa menos recursos y por lo tanto es más rápido. Dependiendo del tipo de información que se envíe, a lo mejor resulta más práctico enviar paquetes UDP que paquetes TCP. Sobre todo cuando son informaciones muy cortas, que no sobrepasan la capacidad de un paquete. Dicen que no es un sistema seguro, pero eso dependerá en gran medida del programa que hagamos. Dado que no es un sistema seguro, deberemos implementar en el programa la secuencia de envío - confirmación de recibido que tiene el TCP. Obviamente eso lo va a complicar un poco. Quizás por eso el protocolo usado generalmente para transmisión de información es el TCP. Le será muy familiar el TCP/IP. Es la combinación del protocolo TCP con IP. Y es momento ahora de explicar con un ejemplo simulado como funciona TCP/IP. Imagínese que TCP coge el bloque de información a transmitir y lo trocea en varios paquetes. A cada uno de ellos le añade el número de orden que tiene ese paquete dentro del bloque total de información, calcula el Checksum que le corresponde y se lo anexa. Con esos datos ya somos capaces de volver a restituir el bloque de información completo. Pero hace falta todavía enviarlo al destinatario. Para ello se lo entregamos al protocolo IP, que lo mete en un "sobre" donde le apunta la dirección y el remitente. Y lo suelta a la red. La red solamente ve la dirección y el remitente (Por favor que nadie se lo crea a pies juntillas, no es así exactamente, esto es solamente un ejemplo) y reencamina el paquete a través de los enrutadores (routers) para hacerlo llegar a su destino. El destinatario abre el sobre, analiza el Checksum, mira el número de paquete que es, comprueba que no lo tiene todavía, y entonces crea un pequeño paquete en el que dice que ha recibido correctamente el paquete con ese número. Lo mete en un sobre IP donde pone como dirección el remitente del paquete recibido y como remite su propia dirección, y lo envía a la red. Ya se encargará la red de hacerlo llegar a su destino. Al recibirlo (lo recibe el terminal que estamos llamando origen) ve que le dan conformidad al paquete enviado, y se despreocupa ya de ese paquete. Otro tema sería que el destino hubiera recibido el paquete y le saliera el Checksum erróneo. Le mandaría un paquete al origen comunicándoselo. Entonces el origen se lo volvería a enviar. Lo mismo ocurriría si el origen, pasado cierto tiempo, no ha recibido confirmación de recibo de un paquete, sea afirmativa o negativa esta confirmación. El origen vuelve a enviar el paquete, hasta que reciba confirmación de que fue bien recibido. ¿Se da cuenta ahora de porque, de vez en cuando, parece que se paraliza la red? El orden de envío de paquetes no tiene porqué ser estricto. No es necesario haber recibido la conformidad del paquete anterior para enviar el siguiente. Veamos ahora lo de la dirección. Decíamos que IP pone la dirección del destinatario y del remitente. Esas direcciones son un conjunto de cuatro números del 0 al 255, separados por un punto. Por ejemplo, podría ser 195.236.12.56 Así de frías son las direcciones de Internet. Como cada número puede tomar los valores del 0 al 255, la numeración total de Internet puede llegar a 4.228.250.625 No son mucho esos cuatro mil doscientos millones. Piense que somos seis mil millones de personas en el mundo. Por eso ha habido que buscar formas de aprovechar al máximo las direcciones IP. No es objeto de este curso su estudio, pero digamos que se logra a base de que las redes de área local conectadas a Internet LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 2

se conectan solamente con un número, e internamente tienen otro (el número interno no coincide con ninguno de Internet, pero se repite en todas las redes de área local). Otra forma de aprovechar la numeración es asignar números dinámicamente. Eso ocurre cuando nos conectamos a Internet desde nuestras casas. Mientras dura la conexión, nuestro ISP (Proveedor de Servicio de Internet) nos cede un número IP de los que le han asignado a él. Cuando nos desconectamos, ese número se lo da al siguiente que se conecte. Por eso, en nuestras casas, cuando nos conectamos a través de la conexión telefónica a redes, no tendremos siempre el mismo número IP. Esta Dirección IP la usa el Protocolo de Red, es decir El Internet Protocol, que como decíamos antes, era como un cartero que recoge una carta del Origen y la pone en el Destino sin saber que es lo que contiene. Ese origen y destino son máquinas, es decir, ordenadores que están conectados a la red. Nota acerca de las direcciones IP. Existe una serie de direcciones IP que no se pueden usar en Internet debido a que están reservadas para redes de área local. Esto se hace así para que nunca pueda haber error entre direcciones. Si asignamos a un equipo interior a una red un número posible en Internet, un Router que esté separando la red de área local del mundo Internet podría equivocarse y enviar hacia fuera un paquete interno a nuestra red. Por eso se han reservado esas direcciones. Son estas De la 10.0.0.0 a la 10.255.255.255 De la 172.16.0.0 a la 172.31.255.255 De la 192.168.0.0 a la 192.168.255.255 Tampoco se pueden usar las direcciones: 0.0.0.0 a la 0.255.255.255 Se usan para llamar al ordenador local principal 255.0.0.0 a la 255.255.255.255 Son direcciones de difusión (transmisión hacia todos los equipos) 127.0.0.0 a la 127.255.255.255 que se usan para funciones internas a la máquina. Técnicamente hablando se dice que estas direcciones son para LoopBack

IP Versión 6 Como esto de Internet lo único que puede hacer es subir, y los 4.200 millones de direcciones se van a quedar cortas tarde o temprano, se está definiendo una nueva versión de direcciones IP, la esperada versión 6, que consistirá en direcciones de 128 bits, frente a los 32 actuales. Si pensamos que cada bit que ampliemos doblamos la capacidad, vemos que la cifra de direcciones posibles sobrepasa las necesidades actuales. (Por sobrepasar, sobrepasa la capacidad de mi calculadora y el resultado es Overflow). Esta solución de 128 bits permitirá conectar cualquier ordenador de una RAL con un número IP verdadero, es decir, un número de la red Internet. Pero eso ya lo veremos en la próxima Guía del Estudiante.

Puertos de Comunicación. Vamos a ver un concepto nuevo: el Puerto de Comunicación. Hasta ahora hemos hablado de direcciones de máquina que son las que ve el protocolo IP. Dentro de una máquina podemos tener varios servicios (Correo, Ftp, www, o cualquier otro programa que nosotros hagamos) Cuando llega uno de esos paquetes que contienen información, la máquina debe saber reconocer a que servicio está destinado. Eso lo sabe mediante el Puerto de Comunicación al que va dirigido el paquete. El puerto de Comunicación no es un puerto físico. Volvemos a lo de siempre: es una forma de hablar. Lo mismo que la dirección IP nos conduce a una máquina, un puerto nos lleva a un servicio dentro de esa máquina. Cuando enviamos una carta, el cartero (Protocolo IP) la lleva al domicilio indicado en el sobre. Imagínese que ese domicilio es en edificio de oficinas. Debemos saber ahora el número de la oficina donde la debemos entregar. Pero el trabajo del cartero ya finalizó cuando nos ha entregado la carta en portería. Para saber el número de la oficina debemos abrir el sobre y ver a que oficina está dirigida. De esto se encarga el Protocolo de Transporte (TCP o UDP) que analiza el contenido del paquete y mira el valor de dos bytes que indican el número del puerto. Esos dos bytes son los que indicarían el número de la oficina en ese edificio de nuestro símil postal. Pero tenga en cuenta siempre que el puerto no indica por donde entra la información a la máquina (entra por la placa de red, que tiene asociado una dirección IP) sino el servicio (un programa) al que va destinada la información. Dado que el número del puerto se expresa con dos bytes, los números de puerto posibles son del 1 al 65536. LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 3

Los 1024 primeros puertos están reservados para distintos servicios de comunicación dentro de la máquina. No los use para sus aplicaciones. Los servicios más conocidos utilizan los siguientes puertos: 1 - tcpmux 5 - rje 7 - echo 9 - discard 11 - systat 13 - daytime 15 - netstat 17 - qotd 18 - send/rwp 19 - chargen 20 - FTP (data) 21 - FTP (control) 22 - ssh, pcAnywhere 23 - Telnet 25 - SMTP 27 - ETRN 29 - msg-icp 31 - msg-auth 33 - dsp 37 - time 38 - RAP 39 - rlp 42 - nameserv/WINS 43 - whois, nickname 49 - TACACS/Login Host Protocol 50 - RMCP 53 - DNS 57 - MTP 59 - NFILE 63 - whois++ 66 - sql*net 67 - bootps 68 - bootpd/dhcp 69 - Trivial File Transfer Protocol (tftp) 70 - Gopher 79 - finger 80 - www-http 88 - Kerberos, WWW 95 supdup 96 – DIXIE 98 - linuxconf 101 - HOSTNAME 102 - ISO, X.400, ITOT 105 - cso 106 – poppassd 109 - POP2 110 - POP3 111 - Sun RPC Portmapper 113 - identd/auth 115 - sftp 117 - uucp 119 - NNTP 120 - CFDP 123 – NTP 124 - SecureID 129 - PWDGEN 133 - statsrv 135 loc-srv/epmap 137 - netbios-ns 138 - netbios-dgm (UDP) 139 - NetBIOS 143 – IMAP 144 NewS 152 BFTP 153 - SGMP 161 - SNMP 175 – vmnet 177 - XDMCP 178 -NextStep Window Server 179 - BGP 180 - SLmail admin 199 - smux 210 - Z39.50 218 – MPP 220 - IMAP3 259 - ESRO 264 -FW1_topo 311 Apple WebAdmin 350 - MATIP type A 351 - MATIP type B 363 - RSVP tunnel 366 - ODMR (On-Demand Mail Relay) 387 - AURP (AppleTalk Update-Based Routing Protocol) 389 - LDAP 407 - Timbuktu 434 - Mobile IP 443 – ssl 444 - snpp, Simple Network Paging Protocol 445 - SMB 458 - QuickTime TV/Conferencing 468 - Photuris 500 - ISAKMP, pluto 512 - biff, rexec 513 who, rlogin 514 - syslog, rsh 515 - lp, lpr, line printer 517 - talk 520 - RIP (Routing Information Protocol) 521 – RIPng 522 - ULS 543 - KLogin, AppleShare over IP 545 – QuickTime 548 AFP 554 - Real Time Streaming Protocol 555 - phAse Zero 563 NNTP over SSL 575 - VEMMI 581 Bundle Discovery Protocol 593 - MS-RPC 608 - SIFT/UFT 626 Apple ASIA 631 - IPP (Internet Printing Protocol) 635 - mountd (Linux) 636 – sldap 642 - EMSD 648 - RRP (NSI Registry Registrar Protocol) 660 - Apple MacOS Server Admin 666 - Doom 674 - ACAP 687 - AppleShare IP Registry 705 - AgentX for SNMP 901 - ISS Real Secure Sensor Port 993 - s-imap 995 - s-pop 1080 - SOCKS 1085 - WebObjects 1243 - SubSeven 1338 - Millennium Worm 1352 - Lotus Notes 1381 - Apple Network License Manager 1417 - Timbuktu 1418 - Timbuktu 1419 - Timbuktu 1433 - Microsoft SQL Server 1434 - Microsoft SQL Monitor 1503 - T.120 1521 - Oracle SQL 1525 - prospero 1526 - prospero 1527 - tlisrv 1645 - RADIUS Authentication 1646 - RADIUS Accounting 1680 - Carbon Copy 1701 - L2TP/LSF 1717 - Convoy 1720 - H.323/Q.931 1723 - PPTP control port 1755 - Windows Media .asf 1758 - TFTP multicast 1812 - RADIUS server 1813 - RADIUS accounting 1818 - ETFTP 1973 - DLSw DCAP/DRAP 1985 - HSRP 1999 - Cisco AUTH 2001 - glimpse 2049 - NFS 2064 - distributed.net 2065 - DLSw 2066 – DLSw 2106 - MZAP 2140 – DeepThroat 2301 Compaq Insight Management Web Agents 2336 - Apple UG Control 2427 - MGCP gateway 2504 – WLBS 2535 - MADCAP 2543 - sip 2727 - MGCP call agent 2592 netrek 2628 - DICT 2998 - ISS Real Secure Console Service Port 3000 - Firstclass 3031 - Apple AgentVU 3128 squid 3130 - ICP 3150 - DeepThroat 3283 - Apple NetAssitant 3288 COPS 3305 – ODETTE 3306 - mySQL 3389 - NT Terminal Server 4321 rwhois 4333 - mSQL 4827 - HTCP 5004 - RTP 5005 – RTP 5010 - Yahoo! Messenger 5060 - SIP 5190 – AIM 5500 - securid 5501 - securidprop 5423 - Apple VirtualUser 5631 - PCAnywhere data 5632 - PCAnywhere 5800 – VNC 5801 – VNC 5900 - VNC 5901 - VNC 6000 - X Windows 6667 – IRC 6670 - VocalTec Internet Phone, DeepThroat 6699 – napster 6776 - Sub7 6970 - RTP 7007 - MSBD, Windows Media encoder 7070 RealServer/QuickTime LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 4

7648 - CU-SeeMe 7649 - CU-SeeMe 8010 - WinGate 2.1 8080 - HTTP 8181 – HTTP 8383 - IMail WWW 13223 - PowWow 13224 – PowWow 14237 – Palm 14238 - Palm 18888 - LiquidAudio 23213 – PowWow 23214 - PowWow 23456 – EvilFTP 26000 – Quake 27001 - QuakeWorld 27015 - Half-Life 27960 - QuakeIII 30029 - AOL Admin 31337 - Back Orifice 40193 – Novell 45000 - Cisco NetRanger postofficed Multicast hidden ICMP Type hidden 32773 - rpc.ttdbserverd 32776 - rpc.spray 32777 - rpc.walld 32779 rpc.cmsd 38036 - timestep (Si quiere una información mayor acerca del número de los puertos, busque en su ordenador un fichero llamado Services. Ese fichero es el que tiene los números de los puertos correspondientes a cada servicio instalado en su ordenador.

Dominios. Administración de dominios. Servidores de DNS Dado que el número 217.126.179.96 no nos dice nada, Internet ha previsto que podamos poner una dirección más amigable. Podría ser por ejemplo, laguiadelestudiante.es y seguro que todo el mundo sabría a quien se refiere esa dirección. A esa dirección le denominamos DNS (Sistema de Nomenclatura de Dominios) Y ahora le vendrá la pregunta siguiente ¿Qué es un dominio?. Un dominio es una palabra que define una parte de Internet. En la dirección anterior, un dominio es es que significa España. Dentro de España, hay una parte llamada laguiadelestudiante. El DNS se compone en este caso de dos palabras. Si algún día la Guía del Estudiante llega al sitio que se merece, puede haber varias partes dentro de su dominio (editorial, correo, ventas) y tendríamos direcciones con tres palabras: editorial.laguiadelestudiante.es correo.laguiadelestudiante.es

ventas.laguiadelestudiante.es

Observe que las palabras van separadas uno de otro mediante un punto. Existe un dominio para cada país. (es para España, cu para Cuba, ar para Argentina, etc.) Pero aparte existe una serie de dominios que no corresponden a ningún país, que se refieren a organizaciones. Por ejemplo, com para organizaciones comerciales, edu para organismos de educación, gov para organizaciones gubernamentales, mil para organizaciones militares, int para organismos internacionales, org para otras organizaciones, net para organizaciones que manejan recursos de la red. Lo de que no pertenecen a ningún país concreto es solo teórico. La mayoría de ellas (edu, gov, mil) pertenecen a USA. Tampoco se merecen ninguna crítica por ello. Han sido los artífices de Internet. Buzones de correo. Un dominio identifica a una máquina. (Un ordenador conectado a la red) Imagínese que ese ordenador es un servidor de correo. En el caso del ejemplo, correo.laguiadelestudiante.es es el DNS del ordenador que gestiona el correo de empresa La Guía del Estudiante. En ese ordenador hay varios buzones para varios usuarios. Uno de los usuarios es Luis Suárez. Parece lógico que su buzón se llame suarez. Para saber que pertenece a la máquina de correo citada, el nombre de ese buzón deberá llevar el DNS de esa máquina. No se podrá poner como nombre del buzón suarez.correo.laguiadelestiante.es ya que suarez no es un dominio, es un buzón. El nombre de un buzón se separa del DNS mediante el carácter @. [email protected] es el nombre de un buzón único en el mundo. Vamos a avanzar un poco más. Imagínese que ese servidor de correo tiene varios clientes cuyo apellido es suarez. Deberemos distinguir uno de otro. Para ello basta con seguir el mismo método que con los dominios. Encadenar varios nombres separados con un punto. Por ejemplo, podríamos poner cono nombre de buzón [email protected] Ya puede enviar tranquilamente sus mensajes a ese buzón. Los enrutadores de internet no se preocuparán de lo que hay a la izquierda de la @. Buscarán la máquina correo.laguiadelestudiante.es. Una vez que la encuentren, depositarán el mensaje y será esa máquina quien se encargue de meter ese mensaje en el buzón luis.suarez de su propiedad. ¿Cómo se traduce el DNS correo.laguiadelestudiante.es al número 217.126.179.96? Mediante unos aparatos conectados en la red que se denominan servidores de DNS o servidores de dominios. Cuando una máquina quiere saber a que número corresponde ese DNS se dirige a su servidor de DNS (del que necesariamente debe conocer su número IP). Le pregunta. Si lo conoce, se lo dice. Si no lo conoce, este servidor de DNS lo buscará en otros servidores de DNS. Estos harán lo mismo. Hasta que uno de ellos LSB Visual Basic Guía del Estudiante Cap. 18 Pág. 5

llegue al servidor de DNS que conoce todos los dominios de España (Hay varios. Uno lo tiene Telefónica, otro una institución llamada RedIris, dependiente del Centro Superior de Investigaciones Científicas CSIC que es quien tiene las competencias sobre dominios). Ese servidor se lo dirá. Y a partir de ahora ya puede meter los paquetes TCP en el sobre IP y poner en este la dirección correcta de 4 números que el servidor DNS le ha facilitado. ¿Se da cuenta por segunda vez de lo que puede hacer que veamos que la red se paraliza por momentos? (No me voy a extender más en esto. Ni le puedo remitir al libro Internet - Guía del estudiante, puesto que ni existe ni existirá. Hay mucha bibliografía sobre el tema que puede consultar El protocolo TCP/IP no se utiliza solamente en Internet. Las redes de Area Local en su gran mayoría lo utilizan. Por lo tanto lo que se va a explicar en este capítulo no solamente le va a servir para Internet. Puede hacer programas que trabajen sobre una red de área local que usa los mismos controles.

Forma de conectarse a Internet Para conectarse a Internet se necesita que un suministrado de servicios de Internet (ISP) nos conecte. Internet es una red muy grande, pero que se diferencia muy poco de una red de área local. Solamente en su extensión. Igual que una red de área local tiene puntos de conexión, Internet también los tiene, pero esos puntos no están en cualquier esquina. Están precisamente en las dependencias de los ISP, conectados a la red a través de líneas de comunicación de datos suministradas por una empresa de telecomunicaciones, que en España es casi con carácter de monopolio, Telefónica. Esos ISP que tienen la conexión real a Internet deben suministrar una parte de esa conexión a cada usuario que se quiera conectar. Existen varias formas de hacerlo: ADSL, Conexión telefónica a redes, conexión a través de una red de área local. Veamos como se conecta de cada una de estas formas, utilizando palabras sencillas, aunque ello vaya en detrimento de la rigurosidad técnica. ADSL (Asimetric Data Suscriber Line). Aprovechando una línea telefónica existente, se envía superpuesto al servicio telefónico unas señales de datos, que no interfieren para nada el uso del teléfono conectado a esa línea. Esta técnica supone una modulación de los datos sobre dos portadoras a varios cientos de kilociclos (la frecuencia de la portadora depende del ancho de banda contratado) por lo que las pérdidas son elevadas. Esto implica que el módem ADSL instalado junto al terminal telefónico deberá estar muy cerca de la central telefónica desde la que envían los datos (Creo que el máximo son unos 2 kilómetros) Por lo tanto, es difícil instalar esta opción en abonados rurales, o en zonas urbanas con instalación de cables muy viejas. Pueden contratarse velocidades de 128 a 512 Kbytes en sentido Usuario -> Internet, y de 256 a 2048 en sentido Internet -> Usuario. Esta asimetría se debe a que normalmente son mas los datos que se “bajan” que los que se envían, y de esta forma se optimizan los recursos del sistema. Mediante esta conexión, estamos conectados continuamente a Internet, y generalmente se tiene un número IP real fijo, pero existen compañías que lo que están enviando a través de esa conexión de alta velocidad es una toma de una red de área local que a su vez está conectada a Internet. El número IP, en el caso que le den una número real de Internet, ninguna empresa le garantiza que se lo vayan a conservar para siempre. Creo que ADSL es hoy por hoy el mejor sistema de conexión a Internet. Conexión mediante la Conexión Telefónica a redes. Para esta forma de conexión, los ISP disponen de varias direcciones IP. Es muy normal que cada ISP tenga uno o varios paquetes 256 direcciones, pero eso dependerá del trafico real que tenga. Este ISP se va a reservar algunas de esas direcciones para su uso particular (Una al menos para que se le pueda llamar y comunicarse con otros servidores desde dentro de la red, otra para el servidor de páginas Web, servidor de correo, servidor DNS si lo tiene, etc.) y el resto las va a asignar durante el tiempo que dure la conexión a sus clientes. Esta asignación de direcciones se le denomina asignación dinámica. Cuando nos conectamos a Internet a través de la conexión telefónica a redes tendremos una dirección. La próxima vez tendremos otra. Por eso, en el ámbito particular no podemos dar una dirección IP para que nos llamen, ya que es variable. Deberemos pedir la conexión a nuestro ISP que nos pedirá el nombre de usuario y la contraseña. Esta operación la realiza el acceso telefónico a redes de Windows. Si coinciden nombre y contraseña con las que tiene el ISP en su banco de datos, nos asigna un número IP de los que tenga disponible y ya estamos conectados. LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 6

Conexión a través de Red de Area Local. Este es el caso de conectarse mediante una RAL o mediante la mayoría de las conexiones rápidas que nos brindan las compañías de telecomunicación por cable. En este caso, la conexión a Internet se realiza en un punto de la red, mediante un ordenador o hub denominado Gateway, Puerta de Enlace o servidor Proxy. La puerta de enlace este tiene dos entradas de red, una conectada a Internet (A través de un módem o directamente mediante una línea de datos) y otra conectada a la RAL. En este caso, cada ordenador conectado a la RAL tiene un número IP, pero no es un número IP de Internet, sino de la red interna. No podremos hacer ping a ese número desde un puesto conectado directamente a Internet. La transferencia de los datos desde Internet a cada uno de los ordenadores lo gestiona el software de la puerta de enlace, siendo completamente transparente para el ordenador que se está conectando. Una vez conectados, sea cual sea el medio utilizado para ello, ya estamos en la red. Ahora ya podemos hacer Ping o Telnet a otro ordenador que también esté conectado. No se preocupe por no saber que es hacer ping o telnet. Eso es cosa de los gurús informáticos. Algunos alumnos, afortunadamente los menos, creían que estaban conectados a Internet solamente cuando se abría el navegador y les mostraba la página Web de su ISP. Otros se creían plenamente conectados cuando eran capaces de abrir su buzón de correo mediante el Outlook Express. Pero esos efectos no son por estar conectados, sino por Abrir un Servicio. Esto nos introduce en el concepto de servicio de Internet. La conexión TCP/IP que habíamos establecido sólo es el soporte de comunicación para que pase por él un servicio. Uno de ellos puede ser el de páginas Web.(http), otro el de correo, (POP3 y SMTP), otro el de FTP (ftp) , otro el Chat (irc). Veamos cada uno de ellos. http (hiper text transfer protocol Protocolo de transferencia de hipertexto) es el servicio para recibir páginas Web. Las páginas Web están diseñadas de tal forma que contengan muy poca información (para que se puedan bajar rápidamente) Existen lenguajes que pueden hacer eso (HTML), que con muy poca información generan páginas preciosas. Pero la poca información que tienen se tiene que cubrir con algo: con un navegador, que es como un editor de texto pero un poco más complicado, porque es capaz de componer la página con toda su belleza a partir de esa información tan escasa. ftp (File Transfer Protocol Protocolo de transferencia de ficheros) Se usa para enviar o recibir fichero completos. Es el servicio que usa cuando se baja un programa de la red. SMTP (Single Mail Tranfer Protocol Protocolo simple de transferencia de correo) Se utiliza para enviar mensajes de correo desde el usuario al servidor de correo y para el tráfico de estos mensajes entre servidores de correo. POP 3 (Post Office Protocol 3 Protocolo de la Oficina de Correo) Se utiliza para que el servidor de correo envíe los mensajes de correo al usuario. Irc (Internet Relay Chat Reenvío de Chat por Internet) Mediante este protocolo una máquina a la que han accedido varios usuarios recibe mensajes escritos de uno de ellos y lo retransmite a los demás.) Cada uno de estos servicios tiene asignado un puerto. Esos puertos puede verlos en la lista que tiene más atrás. Hay mas servicios, pero con esto creo que tenemos suficiente para comenzar a hablar de lo que puede hacer Visual Basic con todos estos servicios.

LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 7

LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 8

Controles de Visual Basic para las redes IP Hemos llegado por fin al Visual Basic puro. Vamos analizar los controles que nos tiene preparados para explotar los recursos de la red. Para cada uno de los servicios anteriores existe un control. Podemos resumirlos en la siguiente lista: Para la conexión: Para http Para FTP Para POP3, SMTP

Control Winsock (Puede implementar con él cualquier servicio) Control WebBrowser, Control Internet Transfer Control Control Internet Transfer Control Controles auxiliares MapiSesion y MAPIMessages

Comencemos por el principio. Por el control que nos permite comunicarnos con otro ordenador mediante TCP y UDP . El Control Winsock

Control Winsock El control WinSock permite conectarse a un equipo remoto e intercambiar datos con los Protocolos UDP y TCP. Ambos protocolos se pueden usar para crear la comunicación con cualquier servicio de los expresados anteriormente. Podemos crear también aplicaciones que residan en un servidor al que accedemos desde varios clientes. Estamos en ese caso creando aplicaciones Cliente - Servidor El control Winsock podríamos decir que es el control más elemental de los controles que VB dedica a las redes IP, ya que lo único que hace por sí es conectarnos. No implementa ningún servicio. Eso se lo tenderemos que hacer nosotros con nuestro programa. Hay controles que nos dan directamente la conexión y el servicio para el que han sido diseñados (WebBrowser, Internet Transfer Control) Con este sólo tenemos la conexión, pero con muchos datos y mucho control sobre ella. Quizás por eso este es el más bonito. Una vez con la conexión establecida, podemos establecer un servicio utilizando código puro y duro. Tiene esa opción o usar los controles específicos que Microsoft y otras firmas le han preparado para que Vd. trabaje menos. El control Winsock hay que meterlo en la caja de herramientas. (Proyecto | Componentes) El nombre del control es Microsoft Winsock Control 6.0 Solamente se ve en tiempo de diseño. Tiene esta forma:

Fig.1 Icono que representa el control winsock La conexión con la red puede que esté establecida de antemano (caso de una Red de Area Local o conexión a Internet a través de ADSL) o tenga que realizarla mediante la conexión telefónica a redes. En cualquiera de los dos casos, el control Winsock comenzará a trabajar una vez que la conexión esté establecida. Pero para poder comunicarse con el otro equipo, deberá conocer una serie de parámetros de su PC, parámetros que posiblemente tenga que pasárselos al otro equipo para que le reconozca y le permita establecer el diálogo. El control Winsock realiza esas tareas que le permiten conocer los parámetros de su equipo. Se lo puede presentar simplemente leyendo algunas de sus propiedades.

Primera tarea ¿Qué dirección IP tiene mi equipo? Esa es la primera pregunta que se le puede ocurrir. Decíamos más atrás que cuando nos conectamos a Internet a través de conexión telefónica a redes no sabemos en principio que dirección IP tenemos. Incluso cuando hacemos un programa para instalarlo en una Red de Area Local (RAL) que tiene un número IP fijo, a lo mejor nos interesa obtener automáticamente ese número para evitar tener que personalizar el programa para cada uno de los ordenadores. El control WinSock nos permite conocer el número IP de nuestra conexión. Esto se logra mediante la propiedad LocalIP

Propiedad LocalIP Devuelve la dirección IP de la máquina local en el formato xxx.xxx.xxx.xxx Es de sólo lectura y no está disponible en tiempo de diseño. LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 9

Sintaxis

MiVariable = NombredelWinSock.LocalIP

MiVariable será una variable de tipo String. Si la dirección de su equipo es la 127.0.0.1 significa que no está conectado.

Segunda tarea ¿Qué nombre tiene mi equipo? Cuando nos conectamos a otro equipo, necesitaremos decirle quien somos. Esto se logra buscando el nombre de nuestro equipo. Ese nombre se lo hemos introducido al instalar Windows. Vea un poco mas adelante como se hace eso. Para leer el nombre de nuestro equipo utilizaremos la propiedad LocalHostName del control Winsock.

Propiedad LocalHostName Devuelve el nombre de la máquina local. Es de sólo lectura y no está disponible en tiempo de diseño. Sintaxis

MiVariable = NombredelWinsock.LocalHostName (MiVariable será una variable tipo String)

Determinar el nombre del equipo Para averiguar y cambiar el nombre del equipo 1.En la Barra de tareas del equipo, haga click en Inicio. 2.En el elemento Configuración, haga click en Panel de control. 3.Haga doble clic en el icono Red. 4.Haga clic en la pestaña Identificación. 5.El nombre del equipo aparecerá en el cuadro Nombre del equipo o Nombre del PC. Si desea cambiarlo, teclee el nombre nuevo y haga click en Aceptar. Como es habitual en Windows, deberá reiniciar el equipo para que tenga efecto el cambio.

Tercera tarea: Establecer el protocolo El protocolo es el tipo de comunicación que se va a establecer, UDP o TCP. Esto se realiza mediante la propiedad Protocol. Puede establecerse en tiempo de diseño, en la ventana de propiedades, o en tiempo de ejecución. Normalmente una aplicación trabaja solamente en UDP o en TCP, por lo que esta propiedad debe establecerse o bien en diseño, o inmediatamente después de iniciarse.

Propiedad Protocol Devuelve o establece el protocolo, TCP o UDP Sintaxis

NombredelControlWinsock.Protocol = Valor

Donde

Valor = 0 (sckTCPProtocol) para establecer protocolo TCP Valor = 1 (sckUDPProtocol) para establecer protocolo UDP

El control debe estar cerrado para poder establecer esta propiedad. Si lo tiene abierto, debe cerrarlo previamente mediante el método Close.

Cuarta tarea: Establecer los datos del equipo remoto Aquí debemos distinguir si queremos enviar información o si deseamos recibirla. Ya tenemos que comenzar a pensar en un concepto que seguro que le suena: cliente y servidor.

LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 10

Cuando un equipo quiere enviar información debe conocer la dirección completa del equipo al que va a llamar. La dirección completa es su dirección IP y el puerto al que va dirigida la información. Si el equipo va a recibir, lo único que debemos decirle es el puerto por el que debe estar escuchando. No necesita conocer más datos, ya que la dirección IP propia ya la conoce y no necesita conocer ningún dato del equipo que le va enviar información. Una aplicación es servidor cuando está escuchando. Así de fácil. (Recuerde el capítulo donde vimos el DDE, pues el concepto cliente servidor en el tema del establecimiento de la comunicación es el mismo). Si una aplicación escucha es que otra puede querer enviarle información. Esa aplicación que quiere enviar información será la aplicación cliente. A poco que nos esforcemos, con este concepto elemental de aplicación cliente – servidor, una aplicación puede ser cliente en un momento y servidor en otro. Cuando se hable de aplicación cliente, ya en términos de la función que realiza esa aplicación, se denomina aplicación servidor a aquella que está dispuesta para enviar información al cliente, o realizar alguna operación con los datos que el cliente le envía. Pero en este caso, estamos hablando de cliente – servidor visto desde el punto de vista de las comunicaciones. No se extrañe por lo tanto, que esa definición tan simple de que una aplicación será servidor cuando está escuchando y cliente cuando está enviando información. Para el equipo cliente. Si queremos enviar información, es decir, si queremos que nuestra aplicación sea una aplicación cliente, debemos indicarle al Winsock el número IP o el DNS de la máquina con la que queremos conectar. Esto lo establecemos con la propiedad RemoteHost. También le debemos indicar el número del puerto en el que nos está esperando esa máquina. Esta información se la introducimos con la propiedad RemotePort. Nunca le debemos forzar el puerto propio.

Propiedad RemoteHost Devuelve o establece el equipo remoto al que se van a enviar los datos, o el equipo del que los recibe. El equipo remoto se le puede identificar por su número IP o por su DNS. Sintaxis

NombredelControlWinsock.RemoteHost = “217.126.179.96” NombredelControlWinsock.RemoteHost = “FTP://ftp.laguiadelestudiante.com” VariableTipoString = NombredelControlWinsock.RemoteHost

Esta propiedad puede cambiarse en tiempo de ejecución cuantas veces sea necesario, para encaminar los datos transmitidos a uno u otro equipo remoto. Otro parámetro que es necesario introducir al Winsock cuando nuestra aplicación es una aplicación cliente (envía información) es el puerto del equipo remoto al que vamos a enviar información. El puerto destino dependerá del servicio que estamos implementando en nuestra aplicación. Este parámetro se introduce en la propiedad RemotePort.

Propiedad RemotePort Devuelve o establece el número del puerto remoto con el que conectar. El valor pasado en esta propiedad es un Long comprendido entre 1 y 65535. El numero predeterminado es el 80. Sintaxis

NombredelControlWinsock.RemotePort = puerto

En una aplicación cliente (recibe información) no se puede establecer esta propiedad. Ya tenemos establecidas las propiedades que necesita un control Winsock para enviar datos a un equipo remoto. Veamos ahora como se establece la comunicación.

LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 11

Para el equipo servidor El equipo que va a recibir información solamente necesita conocer el puerto por el que debe escuchar. Esto se lo decimos mediante la propiedad LocalPort.

Propiedad LocalPort Devuelve o establece el puerto local que desea usar. Es de lectura y escritura, y está disponible tanto en tiempo de diseño como en tiempo de ejecución. Esta propiedad solamente debe utilizarse para poner Winsock a recibir. Cuando va a transmitir datos, aunque puede asignar un puerto determinado para enviarlos es mucho mas prudente dejar al Winsock que utilice el que quiera. De esta forma se asegura que siempre emitirá a través de un puerto libre. (Experiencia propia: Si asigna un puerto determinado para transmitir lo mas probable que le va a pasar es que se le cuelgue el ordenador) Para asegurarse de que no ha asignado ningún puerto, basta con poner el valor 0 en esta propiedad. El valor devuelto por esta propiedad es un Long. Sintaxis

NombredelWinsock.LocalPort = Número

Quinta tarea: Establecer comunicación con el equipo remoto Para esta tarea también debemos distinguir si vamos a recibir información o a enviarla y el protocolo que estemos usando (TCP o UDP)

Comunicación por UDP Vamos a comenzar a ver como nos podemos comunicar con el Winsock a través de UDP. El protocolo UDP permite enviar y recibir información sin establecer previamente una comunicación. Así de simple. Una vez establecidos las propiedades descritas mas atrás, tanto el equipo transmisor como el receptor están ya preparados para trabajar. No hace falta ni poner a escuchar al receptor ni ordenar al transmisor que contacte con el receptor, cosa que como veremos mas adelante, es necesario cuando se trata de una comunicación mediante el protocolo TCP. Esta sencillez del protocolo UDP hace que sea muy válido para una aplicación en la que no sea imprescindible la seguridad de la comunicación. Un ejemplo de aplicación con transmisión con protocolo UDP podría ser el comprobar que ordenadores de están encendidos en un determinado momento, envío de mensajería interna a través de Red de Area Local, etc. Pero eso sí, UDP no sirve para conectarse a través de Internet, ya que los servidores de Internet cortan el paso a los paquetes UDP. Pero el hecho de que no sirvan para Internet no debe hacernos olvidar este protocolo tan sencillo para comunicaciones a través de una RAL interna. Por lo tanto, para paquetes UDP no hace falta hacer nada para establecer la comunicación con el equipo remoto, ni para transmitir ni para recibir.

Comunicación por TCP Aquí sí debemos establecer previamente la conexión. De hecho, se dice de TCP que es un protocolo orientado a conexión. Veamos que hay que hacer para transmitir y recibir con TCP Para el equipo cliente (Transmisor) El equipo que desea enviar datos debe solicitar la conexión. Si existe un equipo destino con dirección IP y el puerto adecuado, este equipo le contestará. (Vea mas adelante el método Accept) También puede LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 12

ocurrir que el equipo destino o no existe, o reciba la solicitud de conexión y no la acepte. Veremos más adelante qué ocurre en el caso de que nadie atienda la solicitud. La solicitud de conexión se realiza mediante el método Connect

Método Connect Solicita una conexión con un equipo remoto. Sintaxis

NombredelcontrolWinsock.Connect hostRemoto, puertoRemoto

Donde hostRemoto es la dirección IP o DNS del equipo remoto, y puertoRemoto es el puerto por donde esperamos nos esté escuchando ese equipo remoto. Este método no devuelve ningún dato. Comentarios Debe invocar el método Connect cuando intente establecer una conexión TCP. Para el equipo servidor (Receptor) Para recibir, primero hace falta poner el Winsock a escuchar, y una vez que reciba una comunicación de un equipo llamante aceptarla. Para poner a escuchar al Winsock basta con invocar el método Listen.

Método Listen Crea un socket y lo establece a modo de escucha. (Sólo para conexiones TCP). Sintaxis

NombredelWinsock.Listen

No lleva ningún argumento ni devuelve ningún valor. Simplemente pone a la escucha al Winsock. Ya con el Winsock a la escucha, ya está dispuesto para recibir una comunicación. Y no le importará de quien venga, basta con que lleve su dirección IP y el puerto en el escucha el Winsock. Cuando el Winsock recibe un intento de conexión se produce el evento ConnectionRequest. Para aceptarla hay que usar el método Accept, pero aquí es donde se empiezan a complicar (solo un poquito) las cosas. Un Winsock solamente puede recibir una comunicación. Por lo tanto, solamente podrá atender a un corresponsal. Esto no es lo que se busca en la mayor parte de los casos, sino que lo que se pretende es estar a la escucha, y atender a todas las llamadas que entren, pudiendo atender a dos o más comunicaciones simultáneamente. Para lograr esto lo que hacemos es tener un Winsock permanentemente a la escucha para recibir los sucesivos intentos de conexión de los corresponsales, y una vez que se recibe uno, se crea una instancia del winsock, y es, con esta instancia, con la que le invocamos el método Accept para aceptarla. De esta forma tendremos tantas instancias (copias) del winsock como comunicaciones activas, más el winsock original que es el que se queda a la escucha de nuevos intentos de conexión. Ni que decir tiene que, una vez terminada la conexión, debe cerrarse la instancia correspondiente a esa conexión. La instancia debe crearse en el procedimiento ConnectionRequest del winsock original. La forma de crear esta instancia es mediante el procedimiento Load. Para ello, el winsock original debe tener la propiedad Index para que de esta forma sea una matriz de controles, aunque originalmente solo exista un elemento de esa matriz, con Index = 0. Las instancias van a tener un nombre (Propiedad Name) igual a la del original, y un índice (Propiedad Index) que tendremos que ponerle en el momento de crear ese LSB Visual Basic Guía del Estudiante Cap. 18 Pág. 13

nuevo winsock. Esto implica que deberemos llevar una lista con los índices de las instancias creadas para no repetir ninguno. No sirve aumentar una unidad el número del índice, ya que no podemos dejar que el número del índice crezca hasta el infinito.

Evento ConnectionRequest Se produce en el equipo local cuando el equipo remoto solicita una conexión. Sólo para aplicaciones de servidor TCP. El evento se activa cuando llega una solicitud de conexión. A partir de la activación de este evento, las propiedades RemoteHostIP y RemotePort almacenan la información acerca del cliente. Este evento pasa como parámetro un número Long con el identificador de la solicitud de conexión. Este identificador (IdSolicitud) lo genera el servidor (el equipo que recibe) y lo necesitaremos para aceptar la conexión mediante el método Accept. NombredelcontrolWinsock_ConnectionRequest (IdSolicitud As Long) El parámetro idSolicitud va a identificar a esa conexión hasta que se cierre. La identificación la hace el winsock analizando en el datagrama entrante la dirección IP del origen, puerto origen y puerto destino, parámetros que no pueden coincidir al mismo tiempo con los de otra comunicación. Este mecanismo va a permitir que el mismo winsock reciba varias comunicaciones simultáneas y sepa diferenciar una de otra

Metodo Accept Este método se utiliza para aceptar una conexión entrante cuando se está tratando un evento ConnectionRequest.. Sólo se usa con el protocolo TCP. Sintaxis

NombredelWinsock.Accept IdSolicitud

Donde IdSolicitud es el número identificador de la solicitud de conexión que pasa el evento ConnectionRequest como parámetro. El método Accept debe hacerse sobre una nueva instancia del control Winsock. No es estrictamente necesario cuando se está utilizando una conexión en la que sabemos con certeza que no vamos a recibir más de una llamada. En el caso de que se produzca un nuevo intento de conexión mientras atiende a una conexión aceptada, además de no poder atenderlo, la experiencia nos dice que se producen problemas, que terminan generalmente haciendo que el programa no responda e incluso colgando el equipo, Recomiendo encarecidamente que la conexión se establezca con una nueva instancia del winsock. Dicho en otras palabras, que el método Accept se ejecute sobre una nueva instancia, aunque la información de Microsoft esté un poco indefinida en este aspecto. Veamos como se crea una nueva instancia del control. Se usa el método Load. Para ello, en el Winsock que colocamos en el proyecto le ponemos, en su propiedad Index el valor 0. Con esto le estamos indicando que es una matriz de controles, pero solamente existe uno, cuyo índice es el 0. Cuando utilizamos el método Load lo que hacemos es añadir un elemento más a esa matriz de controles. Si el control que hemos introducido en el formulario se llamaba Wsk, y le hemos puesto su propiedad Index = 0, para añadir el segundo elemento de esa matriz, que tendrá la propiedad Index = 1, ejecutaremos la siguiente línea de código: Load Wsk (1) Ahora ya tenemos una matriz con dos controles. (Indices 0 y 1) Dejaremos el winsock con índice 0 para seguir recibiendo peticiones de comunicación y ejecutaremos el método Accept sobre el segundo winsock (el de Index = 1) LSB

Wsk (1).Accept IdSolicitud Visual Basic Guía del Estudiante Cap. 18

Pág. 14

A partir de este momento, todo lo que tengamos que hacer para recoger la información recibida, enviar respuestas al corresponsal, cerrar la comunicación lo haremos con la instancia creada para esa conexión. No se nos puede olvidar cerrar el winsock una vez terminada la conexión y descargarlo a continuación. Para descargarlo utilizamos la instrucción Unload Unload Wsk(1) El winsock original lo seguiremos dedicando a recibir nuevas solicitudes de conexión, que a su vez crearán nuevas instancias del winsock. En principio no hay problema para que cada nueva instancia lleve un Index incrementado en 1 respecto a la conexión anterior. Basta con declarar una variable tipo Long para introducir ese índice, y previsiblemente nunca llegaremos a superar los límites del Long. Ahora bien, es mucho mas elegante reutilizar los números de las instancias que se van cerrando. Para esto es necesario utilizar una variable o una matriz, donde llevemos la cuenta de las instancias todavía abiertas del winsock original. Cada una de las instrucciones anteriores se deberán hacer en los eventos apropiados del winsock. Así, el crear un nuevo winsock lo haremos en el evento ConnectionRequest, y el descargarlo lo haremos en el evento Close. Ya tenemos la conexión establecida. Veamos ahora otras propiedades y métodos que nos permitirán conocer la identidad del corresponsal y lo que hay que hacer para enviar y recibir información. Una vez establecida la conexión, mediante el método Connect por parte del cliente, y el método Accept por parte del servidor, ya podemos conocer la identidad del corresponsal mediante la propiedad RemoteHostIP

Evento Connect Este evento ocurre en el Winsock que ha solicitado la conexión, cuando ésta se ha completado. Ocurre por lo tanto cuando el winsock remoto invoca el método Accept. Puede usar este evento parta conformar que se ha realizado la conexión.

Propiedad RemoteHostIP Devuelve una cadena de caracteres con la dirección IP del equipo remoto. NOTA. Esta propiedad es distinta de la de RemoteHost vista mas atrás. La propiedad RemoteHost es la que se debe introducir antes de realizar la conexión, y puede ser, bien una dirección IP de cuatro números, o una DNS. RemoteHostIP devuelve el valor de la dirección IP de cuatro números, una vez que ya se ha establecido la comunicación. Puede consultarse esta propiedad para conocer el número IP real de un sitio, conociendo solamente su DNS. En las aplicaciones de cliente, después de establecer la conexión con el método Connect, esta propiedad contiene la cadena IP del equipo remoto. En las aplicaciones de servidor, después de la llegada de una solicitud de llamada (evento ConnectionRequest), esta propiedad contiene la cadena IP del equipo remoto que inició la conexión. Cuando utiliza el protocolo UDP, después de producirse el evento DataArrival, esta propiedad contiene la dirección IP del equipo que ha enviado los datos UDP.

Propiedad State Permite conocer el estado del winsock y de la conexión que está realizando. Es sólo de lectura y no está disponible en tiempo de diseño. Devuelve un integer Siantaxis LSB

Variabletipointeger = NombredelWinsock.State Visual Basic Guía del Estudiante Cap. 18

Pág. 15

Nos puede devolver uno de los siguientes valores que corresponden a las siguientes constantes Valor

Constante

Estado

0 1 2 3 4 5 6 7 8 9

sckClosed sckOpen sckListening sckConnectionPending sckResolvingHost sckHostResolved sckConnecting sckConnected sckClosing sckError

Cerrado Abierto Escuchando Conexión pendiente Resolviendo Host Host resuelto Conectando Conectado Cerrando la conexión Ha detectado un error

Propiedad SocketHandle Esta propiedad se usa para utilizarla con las Apis de Windows. Devuelve el manipulador del Winsock. Es de sólo lectura y no está disponible en tiempo de diseño. Sintaxis

VariableTipoLong = NombredelWinsock(I).SocketHandle

Donde I es el índice del Winsock. Como se decía más atrás, esta propiedad solamente se emplea usando APIS

Propiedades, Métodos y Eventos del control Winsock usados en la comunicación Hemos visto varias propiedades, métodos y eventos del control Winsock. Hasta ahora hemos visto: Propiedades: Métodos: Eventos

LocalIP, LocalHostName, Protocol, RemoteHost, RemotePort, LocalPort, State Connect, Listen y Accept. ConnectionRequest, Connect

Mediante estas propiedades y métodos establecemos la conexión. Nos falta ahora por ver aquellos métodos usados durante la transmisión o recepción de datos.

Método SendData Envía datos a un equipo remoto. Se emplea tanto en UDP como en TCP. No devuelve ningún valor. Sintaxis

NombredelWinsock(I).SendData datos

Donde NombredelWinsock es el nombre del winsock que debe enviar los datos, I es el índice de ese control (en el caso de que el winsock sea una instancia de un winsock original, como se explicó más atrás) y Datos son los datos a enviar, por ejemplo el nombre de una variable que los contiene o la propiedad text de un textbox donde se han escrito los datos a enviar. Si los datos a enviar son binarios, deberán enviarse como una matriz de bytes. Cuando pasa una cadena UNICODE, se convierte a cadena ANSI antes de enviarla a la red.

Método GetData Recupera los datos existentes en el búffer de recepción del winsock, lo almacena en una variable y borra el contenido del búffer. LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 16

Sintaxis

NombredelWinsock(I).GetData datos, [tipo,] [longMáx]

Donde

datos es el nombre de la variable donde se almacenarán los datos recogidos tipo (Opcional) es el tipo de datos a recuperar (Vea tabla) longMáx (Opcional) Tamaño en bytes a recuperar. Si se omite este parámetro, se recuperan todos los datos existentes en el búffer de recepción. Si se especifica un número inferior a los bytes existentes en el búffer, el resto de los datos se perderán.

Los tipos de datos que se pueden usar en el parámetro tipo son: Byte Single Moneda Cadena

VbByte vbSingle vbCurrency vbString

Entero Simple Fecha Matriz de bytes

vbInteger vbDouble vbDate vbArray + vbByte

Long Double Booleano

vbLong vbDouble vbBoolean

El método GetData se suele usar con el evento DataArrival, que incluye el argumento bytesTotales. Si especifica una longMáx menor que el argumento bytesTotales, obtendrá el mensaje de advertencia 10040, que indica que se perderán los bytes restantes.

Evento DataArrival Se produce cuando llegan nuevos datos. Pasa como parámetro un Long con el número de bytes recibidos. (NombredelWinsock_DataArrival (bytesTotales As Long) Este evento no se producirá si no recupera todos los datos con una llamada GetData. Sólo se activa cuando hay datos nuevos. Utilice la propiedad BytesReceived para comprobar la cantidad de datos disponibles en cualquier momento.

Propiedad BytesReceived Devuelve un Long la cantidad de datos recibidos (que están actualmente en el búffer de recepción). Lógicamente es sólo de lectura y no está disponible en tiempo de diseño. Sintaxis

NombredeWinsock.BytesReceived

Método PeekData Este método es similar a GetData, pero no elimina los datos extraídos del búffer de recepción. Exixte otra diferencia, PeekData solamente funciona en las conexiones TCP. La sintaxis es similar a la de GetData. Sintaxis

NombredelWinsock.PeekData datos, [tipo,] [longMáx]

Los parámetros de este método son los mismos que para GetData.

Evento SendProgress Se produce mientras se están enviando datos. Pasa como parámetros los bytes enviados desde la última vez que se activó el evento (bytesEnv) y los bytes que esperan a ser enviados en el búffer de transmisión (bytesRest) (NombredelWinsock_SendProgress (bytesEnv As Long, bytesRest As Long)

LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 17

Evento SendComplete Se produce cuando termina una operación de envío. No pasa argumentos. NombredelWinsock_SendComplete()

Evento Error Se produce siempre que ocurre un error en los procesos de segundo plano (por ejemplo, un fallo al conectar o un fallo al enviar o recibir en segundo plano). Pasa como parámetros el código de error, la descripción del error, el scode del error, el origen del error, y un booleano para cancelar o aceptar el que presente un cuadro de dialogo con el aviso de error. (Los parámetros de fichero de ayuda y contexto de ayuda, personalmente no los he visto en ninguno de los ejemplos preparados. NombredelWinsock_Error(número As Integer, descripción As String, scode As Long, origen As String, archivoAyuda as String, contextoAyuda As Long, cancelarVista As Boolean)

El código de error puede tomar estos valores: Constante

Valor

Descripción

SckOutOfMemory SckInvalidPropertyValue SckGetNotSupported SckSetNotSupported SckBadState

7 380 394 383 40006

SckInvalidArg

40014

SckSuccess SckUnsupported SckInvalidOp SckOutOfRange SckWrongProtocol

40017 40018 40020 40021 40026

SckOpCanceled SckInvalidArgument

10004 10014

SckWouldBlock

10035

SckInProgress

10036

SckAlreadyComplete

10037

SckNotSocket SckMsgTooBig

10038 10040

SckPortNotSupported SckAddressInUse SckAddressNotAvailable SckNetworkSubsystemFailed SckNetworkUnreachable SckNetReset

10043 10048 10049 10050 10051 10052

SckConnectAborted

10053

SckConnectionReset

10054

Sin memoria El valor de la propiedad no es válido No se puede leer la propiedad La propiedad es de sólo lectura. Protocolo o estado de conexión incorrecto para la solicitud o la transacción requerida. El argumento que se pasó a una función no estaba en el formato correcto o en el intervalo especificado. Correcto Tipo Variant no aceptado. La operación no es válida en el estado actual. El argumento está fuera del intervalo. Protocolo erróneo para la solicitud o la transacción requerida. Se canceló la operación. La dirección solicitada es una dirección de multidifusión, pero el indicador no está activado. El socket es no bloqueante y la operación especificada se bloqueará. Se está efectuando una operación de Winsock bloqueante. Se completó la operación. No se están efectuando operaciones bloqueantes. El descriptor no es un socket. El datagrama es demasiado grande para el búfer y se truncará. El puerto especificado no es compatible. Dirección en uso. La dirección no está disponible en la máquina local. Error en el subsistema de red. El host no puede encontrar la red en este momento. Expiró el tiempo de espera de la conexión antes de establecer SO_KEEPALIVE. La conexión se ha cancelado al sobrepasar el tiempo de espera o por otro error. La conexión se ha restablecido desde el lado remoto.

LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 18

SckNoBufferSpace SckAlreadyConnected SckNotConnected SckSocketShutdown SckTimedout SckConnectionRefused SckNotInitialized SckHostNotFound SckHostNotFoundTryAgain SckNonRecoverableError SckNoData

10055 10056 10057 10058 10060 10061 10093 11001 11002 11003 11004

No hay espacio disponible en el búfer. El socket ya está conectado. El socket no está conectado. El socket se ha desactivado. Se ha sobrepasado el tiempo de conexión. Se ha forzado el rechazo de la conexión. Es necesario llamar primero a WinsockInit. Respuesta autorizada: host no encontrado. Respuesta no autorizada: host no encontrado. Errores no recuperables. Nombre válido; no hay registro de datos del tipo solicitado.

Evento Close Se produce cuando el equipo remoto cierra la conexión. Las aplicaciones deben usar el método Close para cerrar correctamente una conexión TCP.

El Método Bind El método Bind sirve para reservar un puerto local cuando estamos trabajando en una comunicación UDP. Esto puede ser muy útil para evitar que haya otra aplicación escuchando en ese mismo puerto. Hay que darse cuenta que en UDP puede haber muchas aplicaciones escuchando el mismo puerto ya que al no establecerse una comunicación, la información que llega pueden tomarla mas de una aplicación. (Es idéntico al caso en el que una persona hable y muchas escuchan) Si reserva un determinado puerto a un Winsock, a ese puerto no se le puede conectar otro Winsock a escuchar a partir de ese momento. Hay que invocar el método Bind antes de invocar el método Listen. También puede usar el método Bind en una comunicación TCP. Se emplea cuando hay más de un adaptador de red en el equipo (Un equipo con dos placas de red, y cada una de ellas con un número IP). Si en ese equipo hay un Winsock, ¿Qué número IP tiene?. Podría tomar uno de los dos indistintamente. Mediante Bind podemos asignar uno de esos números IP a un Winsock.

Método Bind Especifica el puerto local y la dirección IP local a usar en las conexiones TCP. Sintaxis

NombreDelWinsock.Bind puertoLocal, IPLocal

Donde: PuertoLocal: IPLOcal:

Puerto utilizado para realizar una conexión. Dirección IP local sobre la que se va a establecer la conexión.

LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 19

LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 20

Programa servidor que recibe varias comunicaciones simultaneas. Vamos a realizar un ejemplo consistente en un programa servidor cuya misión sea recibir ficheros desde varios clientes, guardarlos en una base de datos donde apuntará también el origen del fichero y la fecha de recepción, y que envíe al cliente la conformidad de recepción de ese fichero. En sentido contrario, una vez identificado al cliente, podrá enviarle los ficheros pendientes que ese cliente tenga depositado en el servidor. Esto es lo más parecido a un servidor de correo, pero no lo es. Le falta cumplir las especificaciones. Pero bien estará como ejercicio práctico del winsock. El programa podrá recibir simultáneamente desde varios corresponsales. Para enviar, podrá hacerlo de uno en uno, es decir, en un determinado momento solamente podrá estar enviando a otro corresponsal, aunque podrá enviar, en momentos sucesivos, a cuantos corresponsales estén activos. El envío de información se podrá hacer simultáneamente a la recepción. Para lograr esto, es necesario disponer de dos winsock en la aplicación. Uno, que estará recibiendo en un puerto y atendiendo a todas las llamadas entrantes, (Wsk1) y otro, que se usará solamente para enviar información a través de las llamadas salientes (Wsk2). Cada vez que se reciba una llamada entrante, se creará una instancia de Wsk1, que será en realidad la que acepte la llamada usando su método Connect. Debemos elegir un puerto para la escucha. A la hora de decidir el número del puerto debemos pensar que no se pueden usar los 2024 primeros puertos, que el puerto elegido no esté siendo usado de forma internacional por otro servicio (que no esté registrado a ninguna aplicación a nivel mundial) y que no esté usado en nuestros PCs para otro servicio. En nuestro ejemplo, lo que vamos a hacer es leerlo de un fichero de configuración, y colocarlo en un TextBox llamado TbPuertoLocal. De esta forma, al winsock lo programaremos con el puerto indicado en ese TextBox, y a ese TextBox le llevaremos el dato con la lectura del fichero de configuración, operación que se realiza durante la carga del formulario. De esta forma podremos poner en el fichero de configuración el puerto deseado, sin necesidad de variar el programa. Ya vamos teniendo una idea de la interfase gráfica necesaria para empezar. Dado el fin didáctico de este ejemplo, se van a mostrar todos los parámetros que entran a formar parte de la comunicación.

Fig. 2 Aspecto de la parte de la Interfase gráfica de comunicaciones En esta figura se pueden ver dos partes bien diferenciadas, una en azul, (Máquina Local, Instancias activas, Textos/Ficheros recibidos) con la parte de la aplicación correspondiente a la recepción, La parte roja (Equipo remoto llamado) corresponde a la parte de transmisión. En la parte azul tenemos el winsock de recepción (Wsk1) y sus instancias. El contenido de cada cuadro de texto y el origen del dato presentado es el siguiente: Maquina local. Pone el nombre de la máquina local. Ip Local. Pone el número IP de la máquina local. Puerto Local. Pone el puerto de recepción asignado a esta aplicación. Protocolo. UDP o TCP. Puede cambiarse haciendo doble clic en este texto LSB Visual Basic Guía del Estudiante Cap. 18

Sistema Sistema Fichero de configuración Pág. 21

RequestID. Parámetro IdSolicitud Proc. ConnectionRequest Estado. Valor de la propiedad State del Wsk1 Se analiza cada 100 ms. Con Timer1 Ultima máquina remota conectada. Puerto e IP de la última máquina conectada. Se toman de las propiedades RemotePort y RemoteHostIP de Wsk1, en el procedimiento ConnectionRequest. Instancias activas. Se introduce el número de la instancia, requestID, IP remota y puerto remoto de la conexión que ha forzado la creación de una nueva instancia de Wsk1. Cada vez que se cierra una instancia, se elimina de esta lista. El número de la ultima instancia eliminada se presenta el la caja lateral a esta lista. Texto recibido Muestra el texto enviado desde el remoto. Se limpia con cada recepción, y también se puede limpiar con el botón Limpia Texto Rec. Los textos recibidos se acumulan en un fichero (cuyo nombre y path se determinan en el fichero de configuración) con indicación de la hora de recepción y equipo remoto que lo envía. Fichero recibido Presenta el nombre y Path del ultimo fichero recibido. El nombre del fichero es una composición del número de instancia del winsock que lo recibe (tres cifras) y de la fecha y hora del sistema (iiiyyyymmddhhmmss.Dat). El path se introduce en el fichero de configuración. Paralelamente se crea otro fichero con nombre idéntico y extensión .Env con los datos relativos al equipo remoto que lo ha enviado, hora de recepción y localizador del acuse de recibo. Para limpiar esta caja de texto, se hace clic en el botón Limpia Fichero Rec. En la parte roja tenemos todo lo relativo a la transmisión, y las cajas de texto pare enviar mensajes de texto y ficheros. Dirección IP Puerto Protocolo Conectar Cerrar Estado Texto a enviar. Fichero a enviar

LSB

En esta caja se debe introducir el número IP del equipo al que se llama. Se introducirá el puerto en el que escucha el equipo remoto. El puerto por defecto se introduce mediante el fichero de configuración. Protocolo utilizado. (UDP o TCP) se cambia haciendo doble clic en esa caja. Debe usarse el mismo protocolo que el equipo remoto. Haciendo clic en este botón se inicia el proceso de conexión con el equipo remoto. Haciendo clic en este botón se cierra lña conexión existente. Dos etiquetas con el estado del winsock de transmisión. Una, con el valor de la propiedad State, y otra, con la condición de conectado / no conectado. Se hace cada 100 ms. Con el Timer1 Texto que se quiere enviar al equipo remoto. Para comenzar a enviarlo hay que hacer clic sobre el botón  Nombre y path del fichero que se quiere enviar. Para buscarlo dentro del disco, hay que hacer clic sobre el botón ··· Para proceder a su envío, se hace clic sobre el botón  Si existe Texto a enviar y Fichero a enviar, al hacer clic sobre el botón  se enviarán ambos

Visual Basic Guía del Estudiante Cap. 18

Pág. 22

Fig. 3

La aplicación puede conectarse consigo misma

Es muy sencillo comprobar el funcionamiento correcto de la aplicación conectándose consigo misma. En la Fig. 3 podemos ver el aspecto que toma la interfase gráfica de comunicaciones una vez conectada. Observe la coincidencia de las direcciones IP y los puertos utilizados tanto en la parte roja (equipo remoto) como en la azul (equipo local). De esta forma se pueden probar las funciones del programa sin necesidad de un interlocutor remoto.

Fig. 4 Este es el aspecto final del la aplicación. Vea en el disco de ejemplos el código completo. LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 23

LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 24

Visual Basic e Internet (2) Control Microsoft Internet Transfer El control Internet Transfer Microsoft Internet Transfer (Control) El control Internet Transfer ofrece una implementación de dos de los protocolos más ampliamente utilizados en Internet: Protocolo de transferencia de hipertexto (HTTP) y Protocolo de transferencia de archivos (FTP). Mediante el protocolo HTTP, puede conectarse con servidores de World Wide Web para obtener documentos HTML. Con el protocolo FTP puede iniciar sesiones en servidores FTP para descargar y cargar archivos. Las propiedades UserName y Password permiten iniciar sesiones en servidores privados que requieran autentificación. Por otra parte, puede conectar con servidores FTP públicos y descargar archivos. Los comandos más comunes de FTP, como CD y GET, son compatibles por medio del método Execute. Usar el control Internet Transfer El control Internet Transfer implementa dos protocolos de Internet de gran difusión: Protocolo de transferencia de hipertexto (HTTP) y Protocolo de transferencia de archivos (FTP). Con el control Internet Transfer se puede conectar con cualquier sitio que utilice alguno de estos protocolos y obtener archivos mediante los métodos OpenURL o Execute. Funcionamiento básico La funcionalidad del control Internet Transfer depende del protocolo que desee usar. Como los dos protocolos contemplados funcionan de forma distinta, las operaciones que puede realizar dependen del protocolo elegido. Por ejemplo, el método GetHeader sólo funciona con HTTP (documentos HTML). Para poder empezar a usar el control Internet Transfer (Inet) debe estar conectado a una red que disponga de algún servidor Http y Ftp. No tienen porqué ser directamente a Internet. Puede estar conectado a una Intranet donde existan. Pero en este control no podemos hacer lo que hacíamos con el Winsock, conectarnos con nosotros mismos. Este control está para acceder a sitios con un servidor http o ftp. Vamos a ir introduciendo las propiedades del Inet al mismo tiempo que lo conectamos a Internet. Y lo primero es saber si se va a conectar directamente o a través de Proxi. Supongo que el alumno sabrá que es un Proxi, por lo que solamente vamos a explicar la propiedad que tiene el Inet para acceder desde una Red de Area Local (RAL) con o sin Proxi y así zanjamos esa primera dificultad que puede tener para conectarse a la Red: Propiedad AccessType Establece si el Inet se comunica directamente a Internet o a través de Proxi. Sintaxis

NombreDelInet.AccessType = tipo

Tipo acepta los valores: Constante Valor Descripción IcUseDefault 0 Predeterminada. Asume lo que su PC tenga programado en el navegador de Internet que tenga por defecto. IcDirect 1 Directo a Internet. Se usa este valor cuando el Inet se utiliza para comunicar con servidores http o ftp que están en la misma RAL. De esta forma no le afecta cómo tenga programado el acceso de su navegador. IcNamedProxy 2 Le está indicando al Inet que la salida hacia Internet (O la red donde se encuentra el servidor http o ftp) debe hacerla a través del equipo indicado en la propiedad Proxi.

LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 25

Propiedad Proxy Devuelve o establece el nombre del servidor proxy utilizado para comunicar con Internet. Esta propiedad sólo se utiliza cuando el valor de AccessType es icNamedProxy (3). Sintaxis NombredelInet.Proxy = proxy Donde Proxi es el nombre del servidor que se desea usar. Puede usar un proxi distinto para acceder con protocolo Http o Ftp, y determinar porque puerto accede a cada uno de estos servicios. El proxi suele estar programado para que en la parte interior de la red se acceda a los servicios externos a través de un puerto distinto al real. Es típico en la programación de los proxis acceder desde la red interior al sevicio http a través del puerto 8080, en vez del puerto 80. Puede hacer esto estableciendo la propiedad Proxi de la siguiente forma: NombredelInet.Proxy = "ftp=CorpFTP:123 HTTP=CorpHTTP:131" Esta forma de establecer la propiedad hará que para ftp use el servidor Proxi CorpFTP, por el puerto 123, y que para http use el servidor CorpHTTP por el puerto 131. Supongamos que ya estamos conectados a Internet. ¿Que como lo sabemos? Utilizaremos un método del Inet: OpenURL para establecer una comunicación con un servidor http conocido. Si se completa la conexión es que ya estamos conectados.

Método OpenURL Abre y devuelve el documento ubicado en la dirección URL especificada. El documento se devuelve con el tipo Variant. Cuando termina la ejecución del método, las propiedades URL (y las partes de la dirección URL como el protocolo) se actualizan para reflejar la URL actual. Sintaxis

Variable = NombredelInet.OpenUrl url [,tipoDatos]

Donde Variable url TipoDatos

Variable tipo string donde se guardarán los datos obtenidos (Texto) o una variable Variant donde se guardarán los datos obtenidos como matriz de bytes Dirección URL que se desea abrir. Entero que especifica el tipo de datos. Acepta los valores 0 (Predeteminado) para que obtenga los datos como cadena de caracteres, o 1, para que los obtenga como matriz de bytes. Si la URL es una página Web debe poner 0 en este valor.

Ejemplo: En un botón de comando ponemos este código Dim TextoPagina As String TextoPagina = Inet1.OpenURL(TbURL.Text, 0) TbTextoPagina = TextoPagina TbTextoPagina es un TextBox donde vamos a presentar el valor devuelto. Para el valor www.mae.es devolvió esto: Ministerio de Asuntos Exteriores. España <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> LSB Visual Basic Guía del Estudiante Cap. 18

Pág. 26

<noframes> El método OpenURL trabaja de forma síncrona, es decir, espera a recibir el contenido del fichero para ejecutar la línea siguiente del código. Cuando se ejecuta la línea TextoPagina = Inet1.OpenURL(TbURL.Text, 0) La conexión tarda un tiempo en ejecutarse, y el servidor tarda cierto tiempo en buscar el fichero correspondiente a la petición y enviarlo. Y mientras tanto, el código está parado en esa línea, y es solamente cuando se termina de recibir todo el contenido o cuando el Inet genera un error de comunicación cuando se ejecuta la siguiente línea. TbTextoPagina = TextoPagina De no ser síncrona, y dado que la conexión tarda algo (por muy poco que fuese) al ejecutar esta segunda línea la variable TestoPagina estaría vacía, por lo que TbTextoPagina siempre aparecería en blanco. El control Inet es un poco delicado. Como sabrá, la propiedad por defecto de un TextBox es la propiedad Text. Sería de suponer que la línea: TextoPagina = Inet1.OpenURL(TbURL, 0) = Es igual a esta otra: TextoPagina = Inet1.OpenURL(TbURL.Text, 0) Pues el Inet, con la primera línea, da error. Debe tomar TbURL como el objeto tipo control. Sale este error: Error 35752 en tiempo de ejecución: La dirección URL está mal generada Es posible que desee saber si ha conectado con la URL solicitada. Eso puede saberlo analizando la el estado de la conexión. Pero no existe ninguna propiedad que se lo indique. Tiene que ir a buscarlo al único procedimiento que tienen el control Internet Transfer: el evento StateChanged

Evento StateChanged Se produce siempre que hay un cambio de estado en la conexión. Aporta el parámetro estado que es un integer. Inet1_StateChanged(ByVal estado As Integer) estado puede tener uno de estos valores: Constante icNone icHostResolvingHost icHostResolved icConnecting icConnected icRequesting icRequestSent icReceivingResponse icResponseReceived icDisconnecting icDisconnected icError LSB

Valor 0 1 2 3 4 5 6 7 8 9 10 11

Descripción No hay estado del que informar. El control está buscando la dirección IP del host especificado. El control encontró la dirección IP del host especificado. El control está conectando con el equipo host. El control conectó correctamente con el equipo host. El control está enviando una solicitud al equipo host. El control envió correctamente la solicitud. El control está recibiendo una respuesta del equipo host. El control recibió correctamente una respuesta del equipo host. El control se está desconectando del equipo host. El control se desconectó correctamente del equipo host. Se produjo un error en la comunicación con el equipo host.

Visual Basic Guía del Estudiante Cap. 18

Pág. 27

icResponseCompleted 12 La solicitud se completó y se recibieron todos los datos. Puede analizar el estado del Inet introduciendo este código en este procedimiento: Private Sub Inet1_StateChanged(ByVal State As Integer) Select Case State Case 0 LState = "0 - Sin actividad" ‘Lstate es un Label donde presentamos el estado de la conexión Case 1 LState = "1 - Buscando Host" Case 2 LState = "2 - Host encontrado" Case 3 LState = "3 - Conectando" Case 4 LState = "4 - Conectado" Case 5 LState = "5 - Enviando solicitud" Case 6 LState = "6 - Solicitud enviada" Case 7 LState = "7 - Recibiendo respuesta del Host" Case 8 LState = "8 - Respuesta recibida" Case 9 LState = "9 - Desconectando" Case 10 LState = "10 - Desconectado" Case 11 LState = "11 - Error de conexión" Case 12 LState = "12 - Operación completada" End Select End Sub

Este procedimiento no se comporta de igual forma cuando se conecta con una página Http que cuando lo hace con un servidor Ftp. Nos centraremos primero en conexiones con servidores Http, y veremos más adelante como se comporta con servidores Ftp. El procedimiento StateChanged se emplea también para ejecutar el método GetChunk para recuperar datos. Vea este método más adelante. Otro método muy importante para ver páginas en la Web el método GetHeader, que permite recuperar el encabezado o paerte de él de una página. Este método puede ser muy útil cuando tenemos que bajar una página, pero previamente queremos comprobar que ya ha sido actualizada.

Método GetHeader Recupera el encabezado de un archivo HTTP. Devuelve un string. Sintaxis

Inet1.GetHeader (nombreEnc)

Donde: Inet1 NombreEnc

Nombre del control Inet Opcional. Cadena que especifica el encabezado que desea recuperar. Si no indica ninguno los recuperará todos. Los valores permitidos para nombreEnc son (Pueden existir otros, dependiendo el servidor) Date Devuelve la hora y la fecha de la transmisión del documento. El formato de los datos obtenidos es Fri, 01 Nov 2002 12:10:51 GMT. Este dato puede servir para sincronizar los relojes de muchos ordenadores, sin necesidad de recurrir a complejos y costosos sistemas basados en GPS, ya que todos los ordenadores pueden ponerse en hora tomándola de una página Web de referencia. MIME-version Devuelve la versión del protocolo MIME. Normalmente los servidores no contestan a este parámetro. Server Devuelve el tipo del servidor. (Esta respuesta tienen mucho peligro, ya que los hackers es lo primero que miran para realzar un ataque) LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 28

Content-length Devuelve la longitud en bytes de los datos que enviará cuando ejecutemos el método OpenURL. Content-type Devuelve el tipo de contenido MIME de los datos. Last-modified Devuelve la fecha y la hora de la última modificación del documento. El formato de los datos devueltos es Wed, 20 Feb 2002 15:26:44 GMT. Observe que la hora siempre se suministra GMT (Grenwich Meridian Time, una hora menos que en el horario de invierno de España peninsular) La página www.mae.es devuelve este texto: HTTP/1.1 200 OK Server: Microsoft-IIS/5.0 Content-Location: http://www.mae.es/index.htm Date: Fri, 01 Nov 2002 12:10:51 GMT Content-Type: text/html Accept-Ranges: bytes Last-Modified: Wed, 20 Feb 2002 15:26:44 GMT ETag: "0129d023bac11:991" Content-Length: 420 Age: 0

Método Cancel Cancela la solicitud actual y cierra las conexiones establecidas actualmente. No devuelve ningún valor. Sintaxis

Inet1.Cancel

Es posible que este método genere un error, ya que en algunas ocasiones cierra la conexión sin poder cancelar ya el proceso que está en curso. Tenga cuidado al usarlo. Vamos a ver ahora el método más útil de este control. Con él podemos hacer todas las funciones de envío y recogida de ficheros.

Método Execute Ejecuta una solicitud a un servidor remoto. Sólo puede enviar solicitudes válidas para el protocolo que esté utilizando. Lógicamente este método funcionará de forma distinta y necesitará parámetros distintos dependiendo del protocolo que estemos usando. Para el protocolo Http la sintaxis es la siguiente: Sintaxis (Http) Inet1.Execute url, operación, datos, encabezadosSolicitud Inet1 URL

Nombre del control Inet (Opcional) Cadena que especifica la dirección URL con la que se debe conectar el control. Si no se especifica ninguna, se usará la dirección contenida en la propiedad URL operación Opcional. Cadena que especifica el tipo de operación que desea ejecutar. Mas abajo encontrará una lista con las operaciones admitidas. datos Opcional. Cadena que especifica los datos para las operaciones (vea más abajo). EncabezadosSolicitud Opcional. Cadena que especifica los encabezados adicionales para enviarlos al servidor remoto. El formato de los mismos es el siguiente: nombre encabezado: valor encabezado vbCrLf

LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 29

Comandos de HTTP admitidos Los valores válidos para operación son: Operación GET HEAD

Descripción Recupera datos de la dirección URL especificada en la propiedad URL. Envía los encabezados de la solicitud. Envía datos al servidor. Los datos están en el argumento datos. Éste es un método alternativo a GET para el que se especifican las instrucciones adicionales en el argumento datos. Operación de colocación. El nombre de la página que se va a reemplazar está ubicado en el argumento datos.

POST PUT

Es difícil probar estos comandos. Normalmente las páginas comerciales no ofrecen los servicios que a nosotros nos gustaría probar. Vea en los ejemplos entregados una aplicación del comando PUT (Que no podrá ensayar en su casa excepto que tenga acceso a un servidor con Password) Vamos a mostrarle un ejemplo del comando GET. Pero previamente tenemos que hablar de un método que antes habíamos citado de pasada:

Método GetChunk Obtiene datos cuando se produce el evento StateChanged al llegar al estado de respuesta completa (icResponseCompleted = 12) Este método se invoca después de ejecutar el método Execute como una operación GET. Sintaxis

Inet1.GetChunk( tamaño [,tipoDatos] )

Cuando se ejecuta la operación GET los caracteres recibidos desde el servidor se almacenan enun buffer. El método GetChunk recupera los caracteres del buffer en bloques de un tamaño que se debe fijar en el parámetro tamaño. Si la información recibida es mayor que tamaño será necesario hacer un bucle hasta completar la recuperación de todos los caracteres. El parámetro tipoDatos puede ser icString (0) para recuperar una cadena de caracteres, ó icByteArray (1) para recuperar una matriz de bytes. Este es el código que se ha metido en el SelectCase del evento StateChanged, para el caso que State sea 12 Dim vtData As Variant ' Variable de datos. Dim strData As String, bDone As Boolean, F As Integer ' Obtiene el primer bloque. vtData = Inet1.GetChunk(1024, icString) DoEvents Do While Not bDone strData = strData & vtData DoEvents ' Obtiene el bloque siguiente. Está sacando bloques de 1024 caracteres 'hasta que no queda ninguno. En ese caso, GetChunk devuelve la cadena vacía vtData = Inet1.GetChunk(1024, icString) If Len(vtData) = 0 Then bDone = True End If Loop TbTextoExecute.Text = strData If TbNombreFichero <> "" Then F = FreeFile Open "C:\_aaa\" & TbNombreFichero For Output As #F Print #F, strData Close #F End If

LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 30

Método Execute (Continuación) Veamos ahora que puede hacer el método Execute para el protocolo Ftp. Aunque la sintaxis es igual, en Ftp no se usan los parámetros datos y encabezadosSoliicitud y queda como sigue: Sintaxis (Ftp)

Inet1.Execute url, Instruccion

url es el nombre del servidor. Este parámetro puede darle algún problema si no conoce exactamente el nombre del servidor, (Si lleva o no lleva el encabezado FTP:// , si es una DNS o un número IP, ..) Estas direcciones son un ejemplo de ello: “FTP://ftp.microsoft.com”

“Ftp://10.3.22.119”

Instrucción es una cadena que incluye el comando (GET, PUT, ..) y el nombre o nombres de los archivos necesarios. Ejemplos: Inet1.Execute "FTP://ftp.microsoft.com", "GET Disclaimer.txt C:\Temp\Disclaimer.txt" Inet1.Execute "FTP://ftp.microsoft.com", "PWD" Inet1.Execute “Ftp://10.3.22.119”, “PUT C:\Prensa\PrensaDia.Tiff /Documentos/PrensaHoy.Tiff” Nota No se admiten nombres de archivos que incluyan espacios incrustados. Los comandos válidos para FTP son los siguientes: Operación CD archivo1 CDUP CLOSE DELETE archivo1 DIR archivo1 GET archivo1 archivo2 LS archivo1 MKDIR archivo1 PUT archivo1 archivo2 PWD QUIT RECV archivo1 archivo2 RENAME archivo1 archivo2 RMDIR archivo1 SEND archivo1 archivo2 SIZE archivo1

Descripción Cambiar directorio. Cambia al directorio especificado en archivo1. Cambiar al directorio superior. Equivale a "CD.." Cierra la conexión FTP actual. Elimina el archivo especificado en archivo1. Directorio. Busca en el directorio especificado en archivo1. Se admiten comodines, pero el host remoto determina la sintaxis. Si no especifica archivo1, obtendrá una lista completa del directorio de trabajo actual. Puede usar el método GetChunk para obtener los datos del directorio. Recupera el archivo remoto especificado en archivo1 y crea el nuevo archivo local especificado en archivo2. Lista. Busca en el directorio especificado en archivo1. Se admiten comodines, pero el host remoto determina la sintaxis. Puede usar el método GetChunk para obtener los datos de los archivos del directorio. Crear directorio. Crea el directorio especificado en archivo1. El éxito de la operación depende de los privilegios del usuario en el host remoto. Copia el archivo local especificado en archivo1 en el archivo del host remoto especificado en archivo2. Mostrar directorio de trabajo. Devuelve el nombre del directorio actual. Puede usar el método GetChunk para obtener los datos. Termina la sesión del usuario actual. Recupera el archivo remoto especificado en archivo1 y crea un nuevo archivo local especificado en archivo2. Equivale a GET. Cambia el nombre del archivo indicado en archivo1 por el nombre especificado en archivo2. El éxito de la operación depende de los privilegios del usuario en el host remoto. Eliminar directorio. Elimina el directorio remoto especificado en archivo1. El éxito de la operación depende de los privilegios del usuario en el host remoto. Copia el archivo local especificado en archivo1 en el archivo del host remoto especificado en archivo2. Equivale a PUT. Devuelve el tamaño del directorio especificado en archivo1.

Siguiendo con el servidor Ftp de Microsoft podemos ensayar algunos de estos comandos: LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 31

Inet1.Execute "FTP://ftp.microsoft.com", "DIR" Nos devuelve el directorio. Como no hemos realizado ninguna operación sobre ese directorio, nos devolverá el directorio del raíz. bussys/ deskapps/ developr/ KBHelp/ MISC/ MISC1/ peropsys/ Products/ ResKit/ Services/ Softlib/ No contiene ficheros sino más directorios. Uno de ellos es el directorio MISC. Podemos cambiarnos a él con la instrucción: Inet1.Execute "FTP://ftp.microsoft.com", "CD MISC" Y para comprobarlo vamos a pedir otra vez el directorio. Ahora ya vemos que ya contienen ficheros, y más directorios. beckyk/ CBCP.TXT csformat/ DAILYKB/ DISCLAIM.TXT FDC/ friKB/ FULLKB/ Homenet/ INDEX.TXT Jeffreyf/ KB/ KBSPV/ Markesh/ monKB/ NBFCP.TXT NBFCP2.TXT NBFCP3.TXT NBFCP4.TXT NBFCP5.TXT Peach/ PRODUCT.TBL ReadMe1.txt satKB/ Store/ STORE1/ sunKB/ test/ thuKB/ TREE.COM tueKB/ wedKB/ Para realizar este tipo de operaciones debe asegurarse que la operación se ha terminado antes de iniciar una nueva operación. Esto puede verlo con el valor de State del procedimiento StateChanged. Ha de esperar a que tenga el valor icResponseCompleted ( = 12). Es en ese momento cuando debe invocar LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 32

el método GetChunk para sacar los datos del búffer. Es el mismo código del Select Case que ha visto antes, que le repito aquí por comodidad: Case 12 LState = "12 - Operación completada" Dim vtData As Variant ' Variable de datos. Dim strData As String, bDone As Boolean, F As Integer ' Obtiene el primer bloque. vtData = Inet1.GetChunk(1024, icString) DoEvents Do While Not bDone strData = strData & vtData DoEvents ' Obtiene el bloque siguiente. Está sacando bloques de 1024 caracteres 'hasta que no queda ninguno. En ese caso, GetChunk devuelve la cadena vacía vtData = Inet1.GetChunk(1024, icString) If Len(vtData) = 0 Then bDone = True End If Loop TbTextoExecute.Text = strData ‘El texto devuelto se introduce en el TextBox TbTextoExecute End Select Una vez en el directorio adecuado, podemos “bajarnos” un fichero mediante este código: Inet1.Execute "FTP://ftp.microsoft.com", "GET ReadMe1.txt C:\PruebaVB\Leeme1.Txt" Al ejecutarlo dejó el fichero ReadMe1.txt en la carpeta C:\PruebaVB con le nombre Leeme1.Txt. Contenía esto: The Microsoft Knowledge Base is currently published to this server in three formats. Two of the formats are published for legacy reasons and are now obsolete. The KB will be posted to this server only in HTM format as of August 1, 2002. The Microsoft Knowledge base has been posted to this server in text format since 1993. With the growth of the world wide web and the spread of browser technology, the HTML formats of the KB became the defining standard, and in many cases the text rendering of the content lost important data only visible in the HTML view. We will be discontinuing text format output to ensure our customers don't miss critical data in the articles they download from this server. One variant of text files we have been publishing is SPV files. SPV files group articles by the product that they apply to. An article can only belong in one group, which avoids duplicates if more than one collection is downloaded. Today, many articles apply equally to multiple products. As such, the binary or arbitrary division of articles results in information being hidden from customers who needed it. Effective August 1, we will no longer divide articles on this server by these arbitrary groupings and the published SPV files will be deleted. The KB will continue to be available for download at ftp://ftp.microsoft.com/misc/kb as HTM files. The files which were in this location will be available until July 31, 2002 at ftp://ftp.microsoft.com/misc1. The zipped SPV files that were being stored here are now located at ftp://ftp.microsoft.com/misc1 until 07/31/02 at which time these files will no longer be available. In summary: The following folders and/or files at: ftp://ftp.microsoft.com/bussys/...../kb ftp://ftp.microsoft.com/deskapps/...../kb ftp://ftp.microsoft.com/developr/...../kb ftp://ftp.microsoft.com/MISC/ ftp://ftp.microsoft.com/peropsys/...../kb are all located at: ftp://ftp.microsoft.com/MISC1/ and only at: ftp://ftp.microsoft.com/misc/kb will there be HTM files after 7/31/02. Thank you, [email protected]

LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 33

Podría enviar un fichero para el servidor. Pero no se lo iba a aceptar. Muchos de los comandos enumerados arriba sólo pueden ejecutarse si el usuario tiene privilegios en el host servidor. Por ejemplo, los sitios FTP anonymous no permiten enviar ficheros, ni eliminar archivos ni directorios.

Transmisión asíncrona del método Execute Al contrario que el método OpenURL, el método Execute produce una transmisión asíncrona de los datos. Cuando se invoca el método Execute, la operación de transferencia se produce independientemente de otros procedimientos. Por tanto, después de invocar el método Execute es posible ejecutar otro código mientras se reciben datos en segundo plano. Pero cuidado con esto, que no podrá invocar otro método que afecte a la conexión hasta que la transferencia haya terminado o haya sido abortada, por ejemplo, por haber ocurrido un error de transmisión. Este es el motivo por el que tras el método Execute, haya que recurrir al método GetChunk, aplicándolo cuando el parámetro State del procedimiento StateChanged haya tomado el valor 12 (Respuesta completa). No se puede saber cuando ha terminado la recepción de los datos, por lo tanto es necesario disponer de un recurso que nos lo indique. Guardar en un archivo con el método OpenURL El método GET sobre FTP guarda directamente un archivo en un fichero, haciendo una copia exacta del fichero que estaba en el servidor. Recuerde el código con el que nos habíamos bajado el fichero desde Microsoft. Inet1.Execute "FTP://ftp.microsoft.com", "GET ReadMe1.txt C:\PruebaVB\Leeme1.Txt" Es decir: Inet1.Execute "DireccionFTP", "GET NombreFicheroenServidor NombreFicheroLocal" Este método no da ningún problema en cuanto a la exactitud de los datos. El fichero guardado en el disco local es idéntico al que estaba en el servidor. Recuerde que anteriormente habíamos explicado el método OpenURL pero solamente lo habíamos aplicado al contenido de una página Web (Texto) y por lo tanto habíamos puesto en el método OpenURL como tipo de datos strURL Cuando el fichero a bajar mediante OpenURL es un fichero binario (Contiene todos los caracteres posibles) el hecho de decirle que el tipo de datos va a ser texto implica que muchos de los caracteres se perderán (El carácter cero sin ir más lejos) En este caso debe decirle que los datos son una matriz de Bytes. Para ello, debemos declarar como Byte la variable donde vamos a meter cada uno de los caracteres. Si desea guardar en un archivo los datos obtenidos con el método OpenURL, puede usar las instrucciones Open, Put y Close, como se muestra en el código siguiente. En este ejemplo se transfiere un archivo binario a una matriz de bytes antes de guardar los datos en disco: Dim strURL As String Dim bData() As Byte LSB

' Variable de datos Visual Basic Guía del Estudiante Cap. 18

Pág. 34

Dim F As Integer ' Variable para conocer el primer archivo (canal) libre FreeFile strURL = "ftp://ftp.microsoft.com/Softlib/Softlib.exe" F = FreeFile() ' Establece F a un integer con el archivo más bajo sin utilizar ' El resultado del método OpenURL va a la matriz de bytes y ésta se guarda entonces en disco. bData() = Inet1.OpenURL(strURL, icByteArray) Open "C:\Temp\Softlib.exe" For Binary Access Write As #F Put #F, , bData() Close #F Se puede emplear un procedimiento similar para escribir un archivo de texto en disco, pero ahora no es necesaria una matriz de bytes, pues los datos se guardan directamente en el archivo: Dim strURL As String ' Cadena URL Dim intFile As Integer ' Variable FreeFile IntFile = FreeFile() strURL = "http://www.microsoft.com/spanish" Open "c:\temp\MSsource.txt" For Output _ As #IntFile Write #IntFile, Inet1.OpenURL(strURL) Close #IntFile Sugerencia Cuando utilice el método OpenURL o el método Execute, no necesita establecer la propiedad Protocol. El control Internet Transfer establecerá automáticamente el protocolo correcto, según determine la parte de protocolo de la dirección URL. Iniciar sesión en los servidores FTP Hay servidores FTP de dos tipos: públicos y privados. Los servidores públicos, como su nombre indica, están abiertos a todos. Los servidores privados, por otra parte, no le permitirán el acceso si no es un usuario de confianza del servidor. En cualquier caso, el protocolo FTP solicita un nombre de usuario y una contraseña. Estos dos elementos se utilizan para autentificar al usuario y permitir (o impedir) sus acciones posteriores. Para iniciar una sesión en los servidores públicos, la práctica habitual es especificar como nombre de usuario "anonymous", (UserName = "anonymous") y enviar su propia dirección de correo electrónico como contraseña. Sin embargo, este proceso se simplifica aún más con el control Internet Transfer. De forma predeterminada, no hay que indicar los valores de las propiedades UserName y Password, pues el control envía "anonymous" en la primera y su dirección de correo electrónico en la segunda. Si va a iniciar una sesión en un servidor privado, sólo tiene que establecer las propiedades UserName, Password y URL a los valores apropiados e invocar el método Execute, como se muestra en el ejemplo siguiente: With Inet1 .URL = "ftp://ftp.iies.es" .UserName = "NombreRegistrado" .Password = "ClavedeAcceso" .Execute , "DIR" ' Devuelve el directorio. Do While Inet1.StillExecuting = True DoEvents Loop .Execute , "CLOSE" ' Cierra la conexión. End With Una vez invocado el método Execute, la conexión FTP permanecerá abierta. Puede entonces continuar utilizando el método Execute para realizar otras operaciones de FTP, como CD y GET. Cuando haya completado la sesión, cierre la conexión con el método Execute y con la operación CLOSE. También puede cerrar la conexión automáticamente si modifica la propiedad URL e invoca el método OpenURL o Execute; esta acción cerrará la conexión FTP actual para abrir la nueva dirección URL. Ya hemos visto un poco como funciona. No se preocupe si le empiezan fallando las primeras aplicaciones que vaya haciendo. Con lo leído hasta aquí no se conoce todavía este control de forma suficiente. Le llevará un buen tiempo (y muchos errores en sus aplicaciones) aumentar sus LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 35

conocimientos, pero con lo visto tiene para empezar a andar. No olvide que muchas veces la instrucción que está empeñado en hacer no se puede porque le faltan permisos de acceso a su servidor. Paciencia y sobre todo, apunte sus experiencias. Vamos a ver una a una las propiedades del Inet.

LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 36

Propiedades de Control Internet Transfer Propiedad AccessType La hemos visto más atrás. Determina si se accede a Internet directamente (1), con Proxy (2) o las preestablecidas en su PC Propiedad Document Devuelve o establece el archivo o documento que se usará con el método Execute. Si no especifica esta propiedad, se empleará el documento predeterminado del servidor. Si no especifica ningún documento, se producirá un error en las operaciones de escritura. Sintaxis

Inet1.Document = cadena

hInternet (Propiedad) Devuelve el controlador de Internet de la API de Wininet.dll subyacente. Por tanto, puede usar este controlador en llamadas directas a la API. Esta propiedad no se utiliza cuando efectúa el acceso al control desde Visual Basic. Sintaxis

VariableLong = Inet1.hInternet

Propiedad UserName Devuelve o establece el nombre de usuario que se enviará con las solicitudes a los equipos remotos. Si deja en blanco esta propiedad, el control enviará "anonymous" como nombre de usuario al realizar solicitudes. Sintaxis

Inet1.UserName = nombre

Propiedad Password Devuelve o establece la contraseña que se enviará junto con la solicitud de inicio de sesión a los equipos remotos. Si deja esta propiedad en blanco, el control enviará la contraseña predeterminada (Dirección de Correo electrónico). Sintaxis

Inet1.Password = cadena

Propiedad Protocol Establece el protocolo que desea usar con el método Execute. Sintaxis

Inet1.Protocol = entero

Los valores válidos para entero son: Constante Valor icUnknown 0 icDefault 1 icFTP 2 icReserved 3 icHTTP 4 icHTTPS 5

Descripción Desconocido. Protocolo predeterminado. FTP. Protocolo de transferencia de archivos. Reservado para uso futuro. HTTP. Protocolo de transferencia de hipertexto. HTTP seguro.

Comentarios Cuando especifica esta propiedad, la propiedad URL se actualiza para mostrar el nuevo valor. Además, si la parte de protocolo de la dirección URL se actualiza, también se modifica la propiedad Protocol para reflejar el cambio. Los métodos OpenURL y Execute también pueden modificar el valor de esta LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 37

propiedad. El cambio de valor de esta propiedad no tiene ningún efecto hasta que se invoque el siguiente método Execute u OpenURL. Propiedad Proxy Vista más atrás. Devuelve o establece el nombre del servidor proxy utilizado para comunicar con Internet. Propiedad RequestTimeout Devuelve o establece la duración, en segundos, de un intervalo de espera. Si no se responde a una solicitud dentro del intervalo especificado y si la solicitud se efectuó con el método OpenURL (solicitud síncrona), se produce un error. Si la solicitud se efectuó con el método Execute, se producirá el método StateChanged junto con un código de error. El valor 0 de esta propiedad significa espera indefinida. Sintaxis

Inet1.RequestTimeout = tiempoensegundos

Propiedad ResponseCode Devuelve el código de error de la conexión cuando aparece el estado icError (11) en el evento StateChanged. Si desea obtener una descripción del error, vea la propiedad ResponseInfo. Sintaxis

Inet1.ResponseCode= código

Propiedad ResponseInfo Devuelve la descripción del último error que se ha producido. Sintaxis

Inet1.ResponseInfo

Puede usar el evento StateChanged para recibir la notificación de un error. En el case = 11 podemosm poner este código y vemos las dos propiedades anteriores. MsgBox “Ha ocurrido el error “ & Inet1.ResponseCode & “ : “ & Inet1.ResponseInfo Propiedad StillExecuting Devuelve un valor True / False que especifica si el control Internet Transfer está ocupado. El control devolverá True cuando esté realizando una operación como obtener un archivo de Internet y no responderá a ninguna otra solicitud mientras esté ocupado. Sintaxis

VariableBooleana = Inet1.StillExecuting

Si VariableBooleana = True es que está ocupado Propiedad URL Devuelve o establece la dirección URL empleada por los métodos Execute y OpenURL. Sintaxis

Inet1.URL = Nombredela URL

Al invocar los métodos OpenURL y Execute, cambia el valor de esta propiedad por el que se introduzca al ejecutar esos métodos. La modificación de esta propiedad no tiene ningún efecto hasta que se llama al siguiente método OpenURL o Execute. La propiedad URL debe contener al menos un protocolo y un nombre de host remoto. La propiedad URL puede especificar un directorio o un archivo. Por ejemplo, son válidas las dos direcciones URL siguientes: Inet1.URL = HTTP://www.microsoft.com ' Con esta URL sólo obtendrá el directorio del archivo

LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 38

Inet1.URL = "HTTP://www.microsoft.com/disclaimer.txt" ‘' Con esta obtendrá el texto del archivo: La propiedad URL casi no es necesario usarla, ya que se puede introducir directamente en los métodos OpenURL y Execute. Esta propiedad cambia cada vez que se invocan esos método con otro valor para la URL, quedando el último valor usado como valor actual de la propiedad. Nota Cuando utilice el método OpenURL, establezca la propiedad URL antes que las propiedades Password y UserName. Si establece la propiedad URL en último lugar, las propiedades UserName y Password estarán establecidas a "".

Errores interceptables del control Internet Transfer En las tablas siguientes se indican los errores interceptables correspondientes al control Internet Transfer y las constantes asociadas. Constante Valor Descripción IcOutOfMemory 7 "Memoria insuficiente" IcDisconnected 10 El equipo ha sido desconectado de la red. IcTypeMismatch 13 "El tipo no coincide" IcInvalidPropertyValue 380 El valor de la propiedad no es válido IcInetOpenFailed 35750 No se puede abrir el controlador de Internet IcOpenFailed 35751 "No se puede abrir la dirección URL" IcBadUrlL 35752 "La dirección URL está mal generada" IcProtMismatch 35753 "Este método no es compatible con el protocolo" IcConnectFailed 35754 "No se puede conectar con el host remoto" IcNoRemoteHost 35755 "No se ha especificado ningún equipo remoto" IcRequestFailed 35756 "No se puede completar la petición" IcNoExecute 35757 "Debe ejecutar una operación antes de recuperar datos" IcBlewChunk 35758 "No se puede recuperar datos" IcFtpCommandFailed 35759 "Falló el comando FTP" IcUnsupportedType 35760 "No se puede forzar el tipo" IcTimeOut 35761 "Se excedió el tiempo de espera" IcUnsupportedCommand 35762 "El comando no es válido o no es compatible" IcInvalidOperation 35763 "Argumento de operación no válido" IcExecuting 35764 "Todavía se está ejecutando la última petición" IcInvalidForFtp 35765 "Esta llamada no es válida para una conexión FTP" IcOutOfHandles 35767 "Sin controladores" IcinetTimeout 35768 "Se ha excedido el tiempo de espera" IcInetTimeout 35768 Se ha excedido el tiempo de espera IcExtendedError 35769 Error extendido. IcIntervalError 35770 Error interno. IcInvalidURL 35771 Dirección URL no válida. IcUnrecognizedScheme 35772 Patrón no reconocido IcNameNotResolved 35773 Nombre sin resolver. IcProtocolNotFound 35774 Protocolo no encontrado. IcInvalidOption 35775 Opción no válida. IcBadOptionLength 35776 Longitud de opción incorrecta. IcOptionNotSettable 35777 La opción no se puede establecer IcShutDown 35778 Apagar IcIncorrectUserName 35779 Nombre de usuario incorrecto. IcLoginFailure 35781 Error al iniciar la sesión. IcInetIvalidOperation 35782 Operación no válida. IcOperationCancelled 35783 Operación cancelada. IcIncorrectHandleType 35784 Tipo incorrecto de controlador. LSB Visual Basic Guía del Estudiante Cap. 18 Pág. 39

IcIncorrectHandleState IcNotProxyRequest IcRegistryValueNotFound IcbadRegistryParameter IcNoDirectAccess IcIncorrectPassword IcNoContext IcNoCallback IcRequestPending IcIncorrectFormat IcItemNotFound icCannotConnect icConnectionAborted icConnectionReset icForceEntry icInvalidProxyRequest icWouldBlock icHandleExists icSecCertDateInvalid icSecCertCnInvalid icHttpsToHttpOnRedir icMixedSecurity icChgPostIsNotSecure icHttpToHttpsOnRedir icPostIsNonSecure icClientAuthCertNeeded icInvalidCa icClientAuthNotSetup icAsyncThreadFailed icRedirectSchemeChange

35785 35786 35787 35788 35789 35780 35790 35791 35792 35793 35794 35795 35796 35797 35798 35799 35800 35802 35803 35804 35806 35807 35808 35808 35809 35810 35811 35812 35813 35814

icDialogPending

35815

icRetryDialog

35816

icHttpsHttpSubmitRedir

35818

icInsertCdrom

35819

icFtpTransferInProgress icFtpDropped

35876 35877

icFtpNoPassiveMode

35878

icGopherProtocolError icGopherNotFile icGopherDataError icGopherEndOfData icGopherInvalidLocator icGopherIncorrectLocatorT ype icGopherNotGopherPlus icGopherAttributeNotFound icGopherUnknownLocator icHeaderNotFound icHttpDownlevelServer

35896 35897 35898 35899 35900

Estado incorrecto del controlador. No es un proxy. Valor del Registro no válido. Parámetro del registro incorrecto. Sin acceso directo. Contraseña incorrecta. Sin contexto. Sin devolución de llamada. Petición pendiente. Formato incorrecto. No se encuentra el elemento. No se puede conectar. Conexión anulada. Conexión restablecida. Forzar reintento. Petición del proxy no válida Con bloqueo. El controlador ya existe. Fecha de certificación de seguridad no válida. Número de certificación de seguridad no válido. HTTPS a HTTP al redirigir. Seguridad mixta. Cambiar la exposición no es seguro. HTTPS a HTTP al redirigir. La exposición no es segura. Es necesaria la certificación de autorización del cliente. Autorización del cliente no válida. Autorización de cliente no establecida. Error en el subproceso Async. Cambio en el patrón de redirección. La operación está suspendida hasta que cierre un cuadro de diálogo abierto. Intente la operación de nuevo. Debe volver a intentar la operación porque falló la comprobación de seguridad de zona La caché de CD instalable requiere un CD-ROM presente en la unidad. FTP: transferencia en curso. FTP: conexión interrumpida. Se intentó una conexión en modo pasivo (es decir, la solicitud de conexión original se especificó como INTERNET_FLAG_PASSIVE), pero el servidor no permite ese modo. Gopher: Error de protocolo. Gopher: No es un archivo. Gopher: Error de datos. Gopher: Fin de los datos. Gopher: Localizador no válido.

35901

Gopher: Tipo de localizador incorrecto.

35902 35903 35904 35916 35917

Gopher: Sin Gopher Plus. Gopher: No se encontró el atributo. Gopher: Localizador desconocido. HTTP: No se encontró el encabezado. HTTP: Servidor de bajo nivel.

LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 40

icHttpInvalidServerRespons e icHttpInvalidHeader icHttpInvalidQueryRequest icHttpHeaderAlreadyExists icHttpRedirectFailed icSecurityChannelError icUnableToCacheFile icHttpCookieNeedsConfirm ation icHttpCookieDeclined

35918

HTTP: Respuesta del servidor no válida.

35919 35920 35921 35922 35923 35924

HTTP: Encabezado no válido. HTTP: Petición de consulta no válida. HTTP: El encabezado ya existe. HTTP: Falló la redirección. Error de seguridad de canal. No se puede almacenar en caché el archivo. Debe confirmar un cookie suministrado por el servidor antes de que comience la transferencia. No fue aceptado un cookie suministrado por el servidor. No fue posible la conexión con el servidor solicitado. Esto se produjo por el error WSAEHOSTUNREACH recibido desde WinSock. No se pudo alcanzar el servidor proxy solicitado. Existe un error en el archivo de comandos de configuración automática del proxy, de modo que el archivo de comandos no pudo ejecutarse. No se pudo recibir el archivo de configuración automática del proxy solicitado. Debe confirmar una redirección del nivel de protocolo antes de que pueda comenzar la transferencia. El certificado no es válido El certificado ha sido revocado. Falló la operación que intentó porque no pudo pasar la comprobación de seguridad.

35927 35928

icServerUnreachable

35930

icProxyServerUnreachable

35931

icBadAutoProxyScript

35932

icUnableToDownloadScript

35933

icHttpRedirectNeedsConfir mation icSecInvalidCert icSecCertRevoked icFailedDueToSecurityChec k

LSB

35934 35935 35936 35937

Visual Basic Guía del Estudiante Cap. 18

Pág. 41

Visual Basic e Internet (3) Control WebBrowser El Control WebBrowser El control WebBrowser es un control DLL-ActiveX (Concretamente el Shdocvw.dll) que se encuentra en la lista de componentes (Proyecto |Componentes) como Microsoft Internet Controls. En la caja de herramientas está representado como un icono que representa un globo del mundo. Forma parte del Internet Explorer de Microsoft. Es decir, es una pieza de las usadas por Microsoft para su navegador de Internet. El WebBrowser puede buscar páginas en la red o en el disco local y presentarlas. Presenta un documento Html y guarda el historial, de forma que siempre puede volver atrás en su navegación. Puede incluso presentar un documento Word ó Excel. Parece en principio que no es práctico realizar un nuevo navegador, usando precisamente la misma “pieza” que usa el Internet Explorer. Para eso ya tenemos el Internet Explorer. Y ciertamente es así. Pero no voy a negar que tienen algo de sugestivo realizar un navegador propio para nuestras aplicaciones, aún a sabiendas que estamos usando una parte del IE. Analizaremos las propiedades, métodos y evento más relevantes, presentaremos el Guia del Estudiante Internet Explorer, y luego será el alumno quien decida si merece la pena hacer algo con este control o no.

Propiedades del control WebBrowser La información y ayuda del WebBrowser vienen en el disco 2 del MSDN. Dependiendo de cómo haya instalado el MSDN le aparecerá o no en la ayuda normal de VB que sale pulsando F1. Le recomiendo que los dos discos del MSDN debe tenerlos continuamente en su puesto de trabajo. Propiedad Busy Devuelve un valor True / False indicando que el WebBrowser está ocupado en una operación de navegación o bajando un archivo. Puede usar el método Stop para detener la operación en curso. Propiedad Container Devuelve una referencia al formulario u otro contenedor que contiene al WebBrowser. Como devuelve una referencia al objeto, podremos ver cualquier propiedad de ese objeto, por ejemplo, su nombre: Label1 = brwWebBrowser.Container.Name Esta línea devuelve el nombre del formulario que contioenen al WebBrwser Propiedad Document Devuelve una referencia al documento que está presentando el WebBrowser. Al devolver una referencia, podemos ver cualquier propiedad de ese documento, por ejemplo, su título. Propiedad FullScreen Devuelve un valor True / False indicando si el navegador está maximizado. Propiedades Height / Width Devuelven el alto y ancho de la ventana del WebBrowser medidos en la unidad de medida del formulario o contenedor. LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 42

Propiedades Left / Top Devuelven la distancia desde la parte izquierda o desde la parte superior del formulario o contenedor, al vértice superior izquierdo del WebBrowser, medidos en la unidad de medida del formulario. Propiedad LocationName Devuelve una cadena con el nombre del documento que está presentando el WebBrowser. Si lo que está presentando es una página Web del www, devuelve el título de la página. Si lo que está presentando es un fichero del disco, preseta el nombre (Sin el path) de ese fichero Propiedad LocationURL Devuelve una cadena con el nombre del documento que está presentando el WebBrowser. Si lo que está presentando es una página Web del www, devuelve el título de la página. Si lo que está presentando es un fichero del disco, preseta el nombre con el Path completo de ese fichero Propiedad Offline Devuelve o establece un valor True / False que indica si el WebBrowser está actalmente operando en modo OffLine. En este modo, el WebBrowser está obligado a leer las páginas de la caché del ordenador, pero si no las tiene, accede al servidor a buscarlas. Propiedad Parent Devuelve una referencia al formulario o contenedor del WebBrowser. Funciona igual que la propiedad Container. Propiedad ReadyState Devuelve un valor que indica el estado de la operación actual del WebBrowser. Toma uno de los siguientes valores: Valor 0 1 2 3 4

Constante

Descripción

READYSTATE_UNINITIALIZED READYSTATE_LOADING = 1 READYSTATE_LOADED READYSTATE_INTERACTIVE READYSTATE_COMPLETE

Sin operación. Estado por defecto Cargando sus propiedades El WebBrowser ya está inicializado Está descargando una página Ya ha terminado de descargar la página

Propiedad Type Devuelve un string con el tipo de documento que está presentando Label1 = brwWebBrowser.Type Propiedad Visible Establece si el WebBrowser se ve o está oculto

LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 43

Métodos de WebBrowser Método ExecWB Ejecuta un comando usando la interface IOLECommandTarget. La sintaxis es la siguiente: NombreDelWebBrowser.ExecWB nCmdID, nCmdExecOpt, [pvaIn], [pvaOut] NCmdID

(Requerido) Es un Long o una constante que identifica el comando a ejecutar.

NCmdExecOpt (Requerido) Es un Long o constante que indica las opciones de ese comando. PvaIn

(Opcional) Un Variant que se emplea para introducir argumentos al comando.

PvaOut

(Opcional) Un Variant que se emplea para recoger los resultados

La primera cuestión que surge ahora es ¿Dónde está la lista de los comandos que se pueden ejecutar? Desconozco donde se puede encontrar la información de todos los comandos, pero pueden verse uno a uno en el Examinador de Objetos en las clases OLECMDID para los los identificadores de comandos, y OLECMDEXECOPT para las opciones. Asi, si quiere imprimir el contenido del WebBrowser basta con poner la siguiente instrucción: brwWebBrowser.ExecWB OLECMDID_PRINT, OLECMDEXECOPT_PROMPTUSER Esto es lo mismo que decir: brwWebBrowser.ExecWB 6, 2 Y lo que hace es, imprimir (6) y presentar el cuadro de diálogo para seleccionar la impresora. (2) Esto de no conocer la lista de comandos aunque parece dificil (y lo es) es superable. Cuando estamos introduciendo el método ExecWB aparece la lista con todos los comandos posibles. Y habrá que echar imaginación y ver, dentro de la lista presentada, el comando que nos interesa. Así sugió la línea siguiente para guardar la página: brwWebBrowser.ExecWB OLECMDID_SAVEAS, OLECMDEXECOPT_PROMPTUSER Puede ver la lista completa de los comandos en el Explorador de Objetos (Al que se accede pulsando F2) y que presentamos en esta página como recordatorio. En la imagen está presentando la Clase OLECMDID. Puede presentar la clase OLECMDEXECOPT haciendo clic sobre su línea en el cuadro de la izquierda. Dejo al alumno interesado el trabajo de realizar una lista con todos estos comandos, sus constantes y valores. Nota. Para que aparezca en el Explorador de Objetos la lista con todos los comandos OLECMDID debe estar introducido el control WebBrowser en el proyecto.

LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 44

Método GoBack Navega hacia atrás dentro de la lista de las páginas visitadas. Método GoForward Navega hacia delante dentro de la lista de páginas visitadas Método GoHome Abre la página especificada como página inicial en las opciones del Internet Explorer. Método GoSearch Abre la página especificada en el Internet Explorer como página de b´squeda (¿) Método Navigate Abre la página especificada. Sintaxis: NombreWebBrowser.Navigate URL [Flags,] [TargetFrameName,] [PostData,] [Headers] URL

Requerido. Una cadena con la dirección del documento a mostrar. Puede ser una URL de una página en la Web, dirección completa de un fichero en el disco, una dirección IP.

Flags Opcional. Un valor o constante que determina varias cosas, según se explica en la lista siguiente. Pueden sumarse dos o más valores de estos. Constante

Valor

Descripción

NavOpenInNewWindow NavNoHistory NavNoReadFromCache NavNoWriteToCache

1 2 4 8

Abre la página en una nueva ventana. No añade la página a la lista del histórico de páginas. No lee de la cahé del disco para buscar la página. No guarda la página abierta en la caché

TargetFrameName

Opcional. Indica la ventana sobre la que mostrará la nueva página. Los valores posibles son:

_blank Presenta el documento sobre una nueva ventana sin nombre _parent Presenta el documento en el contenedor inmediatamente superior al que tienen el link. _self Presenta el documento dentro de la misma ventana que tienen el link <window_name> Presenta el documento en el frame especificado por el nombre. Si no existe un frame con ese nombre, abre una nueva ventana. PostData Headers

Opcional. Este parámetro es el dato a enviar al servidor durante la transacción HTTP POST (POST es una forma de enviar datos desde un cliente al servidor HTTP) Opcional. En este parámetro se especifican los Header que se envian al servidor para especificar acciones que el cliente desea que haga el servidor.

Método Navigate2 Extiende el método Navigate para poder navegar por carpetas especiales tales como el escritorio o Mi PC. La sintaxis es idéntica a la del método Navigate.

LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 45

Método Refresh Vuelve a cargar el documento que está presentando. Sintaxis

NombredelWebBrowser.Refresh

Método Refresh2 Vuelve a cargar el documento que está presentando. La diferencia con el Método Refresh es que este método contienen un parámetro que especifica el nivel de actualización. Sintaxis

NombredelWebBrowser.Refresh2 Nivel

Nivel puede tomar uno de los siguientes valores: Constante

Valor

Descripción

REFRESH_NORMAL

0

Realiza un refresco simple, en el que no incluye el envio del header “pragma:nocache” al servidor

REFRESH_IFEXPIRED

1

Realiza un refresco simple si la página ha caducado

REFRESH_COMPLETELY

3

Realiza un refresco completo, enviando al servidor el header “pragma:nocache”

El header "pragma:nocache" obliga al servidor a no enviar una copia que tenga en su propia cache. De esta forma sabemos que nos va a enviar la información más reciente. Los navehadores suelen enviar este header cuando el usuario selecciona Actualizar. Esto puede causar problemas en algunos servidores. Método Stop Cancela cualquier navegación pendiente y la recepción de cualquier elemento dinámico de la página, como puede ser sonidos o animaciones.. Sintaxis

NombredelWebBrowser.Stop

Eventos del control WebBrowser

Evento BeforeNavigate2 Este evento ocurre cuando el control WebBrowser cambia la navegación a otra URL diferente. Esto puede ocurrir porque el usuario ha hecho click en un link o por cualquier otra razón. En este evento se tiene la oportunidad de cancelar la nueva navegación. Private Sub object_BeforeNavigate2(ByVal pDisp As Object, ByVal URL As String, ByVal Flags As Long, ByVal TargetFrameName As String, PostData As Variant, ByVal Headers As String, Cancel As Boolean) Para impedir la navegación a una nueva URL basta con poner esta línea de código: Cancel = True

LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 46

DocumentComplete Event Ocurre cuando el documento que está siendo bajado pasa al estado READYSTATE_COMPLETE. Este evento tienen importancia cuando un documento tiene frames, pues se produce cada vez que se termina de enviar el documento correspondiente a cada una de las frames. Evento DownloadBegin Ocurre cuando comienza una operación de navegación. Este evento ocurre inmediatamente después del BeforeNavigate2, excepto que la navegación haya sido cancelada en aquel. A cada evento DownloadBeguin le tiene que suceder un DownloadComplete, por lo que puede aprovechar ambos eventos para señalar mediante un icono que se está bajando un nuevo documento. (El Internet Explorer lo hace mediante un globo mundial girando) Evento DownloadComplete Ocurre cuando la navegación termina, se detienen voluntariamente o ha fallado. Evento NavigateComplete2 Ocurre cuando el WebBrowser ha alcanzado con éxito la nueva URL. A partir de este momento es cuando comienza a bajarse el documento. Este evento es el apropiado para poner el aviso: Sitio Web encontrado. Evento NewWindow2 Ocurre cuando se ha creado una nueva ventana para presentar un nuevo documento. Evento OnFullScreen Ocurre cuando ha cambiado la propiedad FullScreen Evnto OnVisible Ocurre cuando cambia la propiedad Visible ProgressChange Event Ocurre cuando se actualiza el avance de la operación de bajar un documento. Private Sub object_ProgressChange(ByVal Progress As Long, ByVal ProgressMax As Long) Progress

Long conteniendo el número total de Bytes transferidos

ProgressMax

Long con el número total de bytes a tranferir.

Este evento se puede usar para colocar un aviso tranquilizante de la evolución de la descarga del documento.

LSB

Visual Basic Guía del Estudiante Cap. 18

Pág. 47

Related Documents

Capitulo 18 Visual Basic
October 2019 20
Capitulo 9 Visual Basic
October 2019 37
Capitulo 1 Visual Basic
October 2019 27
Capitulo 14 Visual Basic
October 2019 39
Capitulo 15 Visual Basic
October 2019 29
Capitulo 5 Visual Basic
October 2019 31