Beruflich Dokumente
Kultur Dokumente
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.
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 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
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
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.
(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.
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.
(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.
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.
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).
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.
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:
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.
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.
Propiedad LocalHostName
Devuelve el nombre de la máquina local. Es de sólo lectura y no está disponible en tiempo de diseño.
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.
Propiedad Protocol
Devuelve o establece el protocolo, TCP o UDP
El control debe estar cerrado para poder establecer esta propiedad. Si lo tiene abierto, debe cerrarlo
previamente mediante el método Close.
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.
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.
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.
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.
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.
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.
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.
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
Método Connect
Solicita una conexión con un equipo remoto.
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.
Comentarios
Debe invocar el método Connect cuando intente establecer una conexión TCP.
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.
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.
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.
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.
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:
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)
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.
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.
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
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.
Donde I es el índice del Winsock. Como se decía más atrás, esta propiedad solamente se emplea
usando APIS
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.
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.
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.
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_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.
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.
Donde:
PuertoLocal: Puerto utilizado para realizar una conexión.
IPLOcal: Dirección IP local sobre la que se va a establecer la conexión.
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.
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:
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
Fig. 4 Este es el aspecto final del la aplicación. Vea en el disco de ejemplos el código completo.
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.
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.
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.
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.
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.
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.
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)
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:
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.
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
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:
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:
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:
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
Case 12
LState = "12 - Operación completada"
Una vez en el directorio adecuado, podemos “bajarnos” un fichero mediante este código:
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
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.
Es decir:
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:
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.
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.
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.
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.
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).
Propiedad Protocol
Establece el protocolo que desea usar con el método Execute.
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
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.
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.
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.
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.
Propiedad URL
Devuelve o establece la dirección URL empleada por los métodos Execute y OpenURL.
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 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 "".
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.
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.
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
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
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:
Propiedad Type
Label1 = brwWebBrowser.Type
Propiedad Visible
Método ExecWB
Ejecuta un comando usando la interface IOLECommandTarget. La sintaxis es la siguiente:
NCmdExecOpt (Requerido) Es un Long o constante que indica las opciones de ese comando.
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 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:
Método GoForward
Método GoHome
Abre la página especificada como página inicial en las opciones del Internet Explorer.
Método GoSearch
Método Navigate
Sintaxis:
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.
TargetFrameName Opcional. Indica la ventana sobre la que mostrará la nueva página. Los valores
posibles son:
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.
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.
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
Sintaxis NombredelWebBrowser.Stop
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.
Para impedir la navegación a una nueva URL basta con poner esta línea de código:
Cancel = True
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
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
Evnto OnVisible
ProgressChange Event
Este evento se puede usar para colocar un aviso tranquilizante de la evolución de la descarga del
documento.