Está en la página 1de 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 @. Suarez@correo.laguiadelestudiante.es 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 luis.suarez@laguiadelestudiante.es 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: Control Winsock (Puede implementar con él cualquier servicio)


Para http Control WebBrowser, Control Internet Transfer Control
Para FTP Control Internet Transfer Control
Para POP3, SMTP 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)

Wsk (1).Accept IdSolicitud


LSB 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 Variabletipointeger = NombredelWinsock.State


LSB 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 sckClosed Cerrado
1 sckOpen Abierto
2 sckListening Escuchando
3 sckConnectionPending Conexión pendiente
4 sckResolvingHost Resolviendo Host
5 sckHostResolved Host resuelto
6 sckConnecting Conectando
7 sckConnected Conectado
8 sckClosing Cerrando la conexión
9 sckError 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: LocalIP, LocalHostName, Protocol, RemoteHost, RemotePort, LocalPort, State


Métodos: Connect, Listen y Accept.
Eventos 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 VbByte Entero vbInteger Long vbLong


Single vbSingle Simple vbDouble Double vbDouble
Moneda vbCurrency Fecha vbDate Booleano vbBoolean
Cadena vbString Matriz de bytes vbArray + vbByte

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 7 Sin memoria


SckInvalidPropertyValue 380 El valor de la propiedad no es válido
SckGetNotSupported 394 No se puede leer la propiedad
SckSetNotSupported 383 La propiedad es de sólo lectura.
SckBadState 40006 Protocolo o estado de conexión incorrecto para la
solicitud o la transacción requerida.
SckInvalidArg 40014 El argumento que se pasó a una función no estaba en el
formato correcto o en el intervalo especificado.
SckSuccess 40017 Correcto
SckUnsupported 40018 Tipo Variant no aceptado.
SckInvalidOp 40020 La operación no es válida en el estado actual.
SckOutOfRange 40021 El argumento está fuera del intervalo.
SckWrongProtocol 40026 Protocolo erróneo para la solicitud o la transacción
requerida.
SckOpCanceled 10004 Se canceló la operación.
SckInvalidArgument 10014 La dirección solicitada es una dirección de multidifusión,
pero el indicador no está activado.
SckWouldBlock 10035 El socket es no bloqueante y la operación especificada
se bloqueará.
SckInProgress 10036 Se está efectuando una operación de Winsock
bloqueante.
SckAlreadyComplete 10037 Se completó la operación. No se están efectuando
operaciones bloqueantes.
SckNotSocket 10038 El descriptor no es un socket.
SckMsgTooBig 10040 El datagrama es demasiado grande para el búfer y se
truncará.
SckPortNotSupported 10043 El puerto especificado no es compatible.
SckAddressInUse 10048 Dirección en uso.
SckAddressNotAvailable 10049 La dirección no está disponible en la máquina local.
SckNetworkSubsystemFailed 10050 Error en el subsistema de red.
SckNetworkUnreachable 10051 El host no puede encontrar la red en este momento.
SckNetReset 10052 Expiró el tiempo de espera de la conexión antes de
establecer SO_KEEPALIVE.
SckConnectAborted 10053 La conexión se ha cancelado al sobrepasar el tiempo de
espera o por otro error.
SckConnectionReset 10054 La conexión se ha restablecido desde el lado remoto.
LSB Visual Basic Guía del Estudiante Cap. 18 Pág. 18
SckNoBufferSpace 10055 No hay espacio disponible en el búfer.
SckAlreadyConnected 10056 El socket ya está conectado.
SckNotConnected 10057 El socket no está conectado.
SckSocketShutdown 10058 El socket se ha desactivado.
SckTimedout 10060 Se ha sobrepasado el tiempo de conexión.
SckConnectionRefused 10061 Se ha forzado el rechazo de la conexión.
SckNotInitialized 10093 Es necesario llamar primero a WinsockInit.
SckHostNotFound 11001 Respuesta autorizada: host no encontrado.
SckHostNotFoundTryAgain 11002 Respuesta no autorizada: host no encontrado.
SckNonRecoverableError 11003 Errores no recuperables.
SckNoData 11004 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: Puerto utilizado para realizar una conexión.
IPLOcal: 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. Sistema


Ip Local. Pone el número IP de la máquina local. Sistema
Puerto Local. Pone el puerto de recepción asignado a esta aplicación. Fichero de configuración
Protocolo. UDP o TCP. Puede cambiarse haciendo doble clic en este texto
LSB Visual Basic Guía del Estudiante Cap. 18 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 En esta caja se debe introducir el número IP del equipo al que se llama.
Puerto Se introducirá el puerto en el que escucha el equipo remoto. El puerto por
defecto se introduce mediante el fichero de configuración.
Protocolo Protocolo utilizado. (UDP o TCP) se cambia haciendo doble clic en esa caja.
Debe usarse el mismo protocolo que el equipo remoto.
Conectar Haciendo clic en este botón se inicia el proceso de conexión con el equipo
remoto.
Cerrar Haciendo clic en este botón se cierra lña conexión existente.
Estado 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 a enviar. Texto que se quiere enviar al equipo remoto. Para comenzar a enviarlo hay que
hacer clic sobre el botón 
Fichero a enviar 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

LSB 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 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
url Dirección URL que se desea abrir.
TipoDatos 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:

<html>
<head>
<title>Ministerio de Asuntos Exteriores. España</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<frameset cols="1,*" frameborder="NO" border="0" framespacing="0">
<frame name="nulo" scrolling="NO" noresize >
<frame name="inicial" scrolling="auto" src="/mae/index.jsp" >
</frameset>
LSB Visual Basic Guía del Estudiante Cap. 18 Pág. 26
<noframes>
<body bgcolor="#FFFFFF">
</body>
</noframes>
</html>

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 Valor Descripción


icNone 0 No hay estado del que informar.
icHostResolvingHost 1 El control está buscando la dirección IP del host especificado.
icHostResolved 2 El control encontró la dirección IP del host especificado.
icConnecting 3 El control está conectando con el equipo host.
icConnected 4 El control conectó correctamente con el equipo host.
icRequesting 5 El control está enviando una solicitud al equipo host.
icRequestSent 6 El control envió correctamente la solicitud.
icReceivingResponse 7 El control está recibiendo una respuesta del equipo host.
icResponseReceived 8 El control recibió correctamente una respuesta del equipo host.
icDisconnecting 9 El control se está desconectando del equipo host.
icDisconnected 10 El control se desconectó correctamente del equipo host.
icError 11 Se produjo un error en la comunicación con el equipo host.
LSB 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 Nombre del control Inet
NombreEnc 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 Nombre del control Inet


URL (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 Descripción
GET Recupera datos de la dirección URL especificada en la propiedad URL.
HEAD Envía los encabezados de la solicitud.
Envía datos al servidor. Los datos están en el argumento datos. Éste es
POST 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
PUT
está ubicado en el argumento datos.

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 Descripción
CD archivo1 Cambiar directorio. Cambia al directorio especificado en archivo1.
CDUP Cambiar al directorio superior. Equivale a "CD.."
CLOSE Cierra la conexión FTP actual.
DELETE archivo1 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
DIR archivo1
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
GET archivo1 archivo2
local especificado en archivo2.
Lista. Busca en el directorio especificado en archivo1. Se admiten comodines,
LS archivo1 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
MKDIR archivo1
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
PUT archivo1 archivo2
especificado en archivo2.
Mostrar directorio de trabajo. Devuelve el nombre del directorio actual. Puede
PWD
usar el método GetChunk para obtener los datos.
QUIT Termina la sesión del usuario actual.
RECV archivo1 Recupera el archivo remoto especificado en archivo1 y crea un nuevo archivo
archivo2 local especificado en archivo2. Equivale a GET.
Cambia el nombre del archivo indicado en archivo1 por el nombre
RENAME archivo1
especificado en archivo2. El éxito de la operación depende de los privilegios
archivo2
del usuario en el host remoto.
Eliminar directorio. Elimina el directorio remoto especificado en archivo1. El
RMDIR archivo1
éxito de la operación depende de los privilegios del usuario en el host remoto.
SEND archivo1 Copia el archivo local especificado en archivo1 en el archivo del host remoto
archivo2 especificado en archivo2. Equivale a PUT.
SIZE archivo1 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,
endspv@microsoft.com

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 ' Variable de datos
LSB 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 Descripción
icUnknown 0 Desconocido.
icDefault 1 Protocolo predeterminado.
icFTP 2 FTP. Protocolo de transferencia de archivos.
icReserved 3 Reservado para uso futuro.
icHTTP 4 HTTP. Protocolo de transferencia de hipertexto.
icHTTPS 5 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 35785 Estado incorrecto del controlador.
IcNotProxyRequest 35786 No es un proxy.
IcRegistryValueNotFound 35787 Valor del Registro no válido.
IcbadRegistryParameter 35788 Parámetro del registro incorrecto.
IcNoDirectAccess 35789 Sin acceso directo.
IcIncorrectPassword 35780 Contraseña incorrecta.
IcNoContext 35790 Sin contexto.
IcNoCallback 35791 Sin devolución de llamada.
IcRequestPending 35792 Petición pendiente.
IcIncorrectFormat 35793 Formato incorrecto.
IcItemNotFound 35794 No se encuentra el elemento.
icCannotConnect 35795 No se puede conectar.
icConnectionAborted 35796 Conexión anulada.
icConnectionReset 35797 Conexión restablecida.
icForceEntry 35798 Forzar reintento.
icInvalidProxyRequest 35799 Petición del proxy no válida
icWouldBlock 35800 Con bloqueo.
icHandleExists 35802 El controlador ya existe.
icSecCertDateInvalid 35803 Fecha de certificación de seguridad no válida.
icSecCertCnInvalid 35804 Número de certificación de seguridad no válido.
icHttpsToHttpOnRedir 35806 HTTPS a HTTP al redirigir.
icMixedSecurity 35807 Seguridad mixta.
icChgPostIsNotSecure 35808 Cambiar la exposición no es seguro.
icHttpToHttpsOnRedir 35808 HTTPS a HTTP al redirigir.
icPostIsNonSecure 35809 La exposición no es segura.
icClientAuthCertNeeded 35810 Es necesaria la certificación de autorización del cliente.
icInvalidCa 35811 Autorización del cliente no válida.
icClientAuthNotSetup 35812 Autorización de cliente no establecida.
icAsyncThreadFailed 35813 Error en el subproceso Async.
icRedirectSchemeChange 35814 Cambio en el patrón de redirección.
La operación está suspendida hasta que cierre un cuadro de
icDialogPending 35815
diálogo abierto.
icRetryDialog 35816 Intente la operación de nuevo.
Debe volver a intentar la operación porque falló la
icHttpsHttpSubmitRedir 35818
comprobación de seguridad de zona
La caché de CD instalable requiere un CD-ROM presente en
icInsertCdrom 35819
la unidad.
icFtpTransferInProgress 35876 FTP: transferencia en curso.
icFtpDropped 35877 FTP: conexión interrumpida.
Se intentó una conexión en modo pasivo (es decir, la solicitud
de conexión original se especificó como
icFtpNoPassiveMode 35878
INTERNET_FLAG_PASSIVE), pero el servidor no permite ese
modo.
icGopherProtocolError 35896 Gopher: Error de protocolo.
icGopherNotFile 35897 Gopher: No es un archivo.
icGopherDataError 35898 Gopher: Error de datos.
icGopherEndOfData 35899 Gopher: Fin de los datos.
icGopherInvalidLocator 35900 Gopher: Localizador no válido.
icGopherIncorrectLocatorT
35901 Gopher: Tipo de localizador incorrecto.
ype
icGopherNotGopherPlus 35902 Gopher: Sin Gopher Plus.
icGopherAttributeNotFound 35903 Gopher: No se encontró el atributo.
icGopherUnknownLocator 35904 Gopher: Localizador desconocido.
icHeaderNotFound 35916 HTTP: No se encontró el encabezado.
icHttpDownlevelServer 35917 HTTP: Servidor de bajo nivel.
LSB Visual Basic Guía del Estudiante Cap. 18 Pág. 40
icHttpInvalidServerRespons
35918 HTTP: Respuesta del servidor no válida.
e
icHttpInvalidHeader 35919 HTTP: Encabezado no válido.
icHttpInvalidQueryRequest 35920 HTTP: Petición de consulta no válida.
icHttpHeaderAlreadyExists 35921 HTTP: El encabezado ya existe.
icHttpRedirectFailed 35922 HTTP: Falló la redirección.
icSecurityChannelError 35923 Error de seguridad de canal.
icUnableToCacheFile 35924 No se puede almacenar en caché el archivo.
icHttpCookieNeedsConfirm Debe confirmar un cookie suministrado por el servidor antes
35927
ation de que comience la transferencia.
icHttpCookieDeclined 35928 No fue aceptado un cookie suministrado por el servidor.
No fue posible la conexión con el servidor solicitado. Esto se
icServerUnreachable 35930 produjo por el error WSAEHOSTUNREACH recibido desde
WinSock.
icProxyServerUnreachable 35931 No se pudo alcanzar el servidor proxy solicitado.
Existe un error en el archivo de comandos de configuración
icBadAutoProxyScript 35932 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
icUnableToDownloadScript 35933
proxy solicitado.
icHttpRedirectNeedsConfir Debe confirmar una redirección del nivel de protocolo antes de
35934
mation que pueda comenzar la transferencia.
icSecInvalidCert 35935 El certificado no es válido
icSecCertRevoked 35936 El certificado ha sido revocado.
icFailedDueToSecurityChec Falló la operación que intentó porque no pudo pasar la
35937
k comprobación de seguridad.

LSB 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 Constante Descripción

0 READYSTATE_UNINITIALIZED Sin operación. Estado por defecto


1 READYSTATE_LOADING = 1 Cargando sus propiedades
2 READYSTATE_LOADED El WebBrowser ya está inicializado
3 READYSTATE_INTERACTIVE Está descargando una página
4 READYSTATE_COMPLETE 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 1 Abre la página en una nueva ventana.


NavNoHistory 2 No añade la página a la lista del histórico de páginas.
NavNoReadFromCache 4 No lee de la cahé del disco para buscar la página.
NavNoWriteToCache 8 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 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)
Headers 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