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 pretender crear un navegador navegador similar similar al Internet Explorer Explorer o al Netescape, Netescape, un correo que supere 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. 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. IP. Protocolos Protoco los de comunicación comunicac ión en redes IP Una red IP es una red de comunicación comunicación basada en la transmisión transmisión bidireccional bidireccional de paquetes. 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 sitio para volver a formar formar el bloque bloque de inform informaci ación ón que teníamos teníamos en origen origen.. Esta Esta técnic técnica a permit permite e compartir al mismo tiempo los recursos de la red por muchos usuarios, sin que ninguno de ellos pueda bloquear bloquear la red por el hecho de enviar una gran cantidad cantidad de información. información. Cada usuario 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 información original original se trocee en paquetes paquetes que se envían 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 (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. confirmación. En cualquier cualquier caso el origen vuelve a enviar y el receptor puede saber perfectamente 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 Transmisión. El protocolo UDP (que significa User Datagram Protocol) o Protocolo de Datagramas de Usuario es un protocolo protocolo que envía paquetes paquetes sin esperar esperar respuesta. respuesta. No le preocupa 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 mejo mejorr resu resultlta a más más prác práctitico co envi enviar ar paqu paquet etes es UDP UDP que que paqu paquet etes es TCP TCP. Sobre Sobre todo todo cuand cuando o son 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 tiene el TCP TCP. Obvi Obviam amen ente te eso eso lo va a comp complilica carr un poco poco.. Quiz Quizás ás por eso eso el prot protoc ocol olo o usad usado o generalmente para transmisión de información es el TCP. TCP. Le será muy familiar el TCP/IP. Es la combinación del protocolo TCP con IP. Y es momento ahora de explic explicar ar con un ejempl ejemplo o simul simulado ado como funcion funciona a TCP/IP TCP/IP.. Imagín Imagínese ese que TCP coge el bloque 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 paquete que es, 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 cada número puede tomar los valores valores del 0 al 255, la numeración numeración total de Internet Internet puede llegar a 4.228.250.625 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 formas de aprovechar al máximo máximo las direcciones direcciones IP. 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 siguiente que se conecte. 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. 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 Existe una serie de direccio direcciones nes IP que que no se pueden 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 10.0.0.0 a la 10.255.255.255 De la 172.16.0.0 a 172.16.0.0 a la 172.31.255.255 De la 192.168.0.0 a 192.168.0.0 a la 192.168.255.255 Tampoco se pueden usar las direcciones: 0.0.0.0 a 0.0.0.0 a la 0.255.255.255 Se 0.255.255.255 Se usan para llamar al ordenador local principal 255.0.0.0 a 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 funcione funciones s internas internas a la máquina máquina.. Técnicame Técnicamente nte 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 versión 6, que consistirá consistirá en direcciones direcciones de 128 bits, frente a los 32 actuales. actuales. Si pensamos 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, verdadero, es decir, decir, un número de la red Internet. Internet. Pero eso ya lo veremos en la próxima Guía del Estudiante. Puertos de Comunicación. Vamos amos a ver ver un conc concept epto o nuev nuevo: o: el Puert Puerto o de Comu Comuni nicac cación ión.. Hast Hasta a ahor ahora a hemo hemoss habl hablad ado o de direcciones de máquina que son las que ve el protocolo IP. Dentro de una máquina podemos tener varios servicios servicios (Correo, (Correo, Ftp, www, o cualquier cualquier otro programa que nosotros hagamos) hagamos) Cuando Cuando llega uno de esos esos paquet paquetes es que contie contienen nen inform informaci ación, ón, la máquina máquina debe debe saber saber reconoc reconocer er a que servic servicio io está 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 dirección IP nos conduce a una máquina, un puerto nos lleva a un servicio 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 entregado la carta en portería. portería. Para saber el número de la oficina debemos abrir el sobre y ver a que oficina está dirigida. 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 nuestro símil postal. Pero tenga en cuenta siempre 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 (un programa) al que va destinada la información. 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 - di 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 - PW DGEN 133 - statsrv 135 loc-srv/epmap 137 - netbios-ns 138 - netbios-dgm (UDP) 139 - NetBIOS 14 143 – IMAP 144 NewS 152 BFTP 153 - SGMP 161 - SNMP 175 – vmnet 177 - XDMCP 178 -Nex -NexttStep Win Window Server rver 179 - BGP 180 - SLmail admi dmin 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 (A (AppleTalk Up Update-B e-Base ased Ro Routi uting Protocol) 389 - LD LDAP 407 - Ti 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 51 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 575 - VEMMI VEMMI 581 581 Bundl Bundle e Disc Discove overy ry Pro Proto toco coll 593 593 - MS-RP MS-RPC C 608 608 - SIFT/ SIFT/UF UFT T 626 Apple ASIA 631 - IPP (Internet Printing Protocol) 635 - mountd (Linux) 636 636 – slda sldap p 642 642 - EMSD EMSD 648 648 - RRP RRP (NSI (NSI Regi Regist stry ry Regi Regist stra rarr Pro Proto toco col) l) 660 - Apple MacOS Server Admin 666 - Doom 674 - ACAP 687 687 - Apple ppleS Share hare IP Regis egistr tryy 705 705 - Agent gentX X for for SNMP NMP 901 - IS ISS Rea Reall Sec Secur ure e Sen Senso sorr Por Portt 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 - Mic Micros rosoft SQ SQL Monitor 1503 - T.120 1521 - Oracl acle SQ SQL 1525 - prosp ospero 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 2998 - ISS ISS Real Real Secu Secure re Cons Consol ole e Ser Servi vice ce Port Port 3000 3000 - Fir First stcl clas asss 3031 3031 - Appl Apple e Agen AgentV tVU U 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 6670 - Voc Vocal alT Tec Inte Intern rnet et Phone Phone,, Dee DeepTh pThro roat at 6699 6699 – naps napste terr 6776 6776 - Sub7 Sub7 6970 6970 - RTP 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 - Ba Back Or Orifice 40193 – No 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á 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 DNS se compon compone e en este este caso de de dos palabras. palabras. Si algún día la Guía del Estudiante Estudiante llega al sitio sitio que se merece, puede haber varias 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 Observe que las palabras van separadas separadas uno de otro mediante un punto. Existe 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 que no corr corres espo pond nden en a ningú ningún n país país,, que se refi refier eren en a organ organiza izaci cion ones es.. Por Por ejem ejempl plo, o, com para organizacion organizaciones es comerciales, comerciales, edu para para organ organis ismos mos de educ educac ació ión, n, gov para para organi organizac zacion iones es 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 servidor de correo. correo. En el caso del ejemplo, ejemplo, correo.laguiadelestudiante.es es el DNS del ordenador que gestiona el correo de empresa La Guía del Estudiante. En ese ordenador hay
varios buzones para varios usuarios. Uno de los usuarios es Luis Suárez. Parece lógico que su buzón se llame suarez. Para saber que pertenece a la máquina de correo citada, el nombre de ese buzón deberá llevar el DNS de esa máquina. No se podrá poner como nombre del buzón suarez.correo.laguiadelestiante.es ya que suarez no es un dominio, es un buzón. El nombre de un buzón se separa del DNS mediante el carácter @.
[email protected] es el nombre de un buzón único en el mundo . Vamos a avanzar un poco más. Imagínese que ese servidor de correo tiene varios clientes clientes cuyo apellido es suarez. Deberemos Deberemos distinguir distinguir uno de otro. Para ello basta con seguir el mismo método que con los dominios. Encadenar varios nombres separados con un punto. Por ejemplo, podríamos poner cono nombre de buzón
[email protected] Ya puede enviar tranquilamente sus mensajes mensajes a ese buzón. Los enrutadores enrutadores de internet no se preocuparán preocuparán de lo que hay a la izquierda 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.laguiadeles correo.laguiadelestudiant tudiante.es e.es al número 217.126.179.96? 217.126.179.96? Mediante 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 corresponde ese DNS se dirige a su servidor 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 tie ne Telefónica, 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 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 TCP/IP no se utiliza utiliza solamente en Internet. Las redes de Area Local en su gran mayoría lo utilizan. utilizan. Por lo tanto lo que se va a explicar explicar en este capítulo capítulo no solamente le va a servir para Internet. 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. (Asimetri tricc Data Data Suscri Suscriber ber Line) Line).. ADSL (Asime
Aprove Aprovecha chando ndo una una línea línea telefón telefónica ica exis existen tente, te, se envía 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 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 normalmente son mas los datos que se “bajan” “bajan” que los que se envían, envían, y de esta forma se optimizan optimizan los recurs recursos os del sistem sistema. a. Median Mediante te esta esta conexi conexión, ón, estamo estamoss conect conectado adoss contin continuame uamente nte a Interne Internet, t, 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 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. 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 conexión telefónica telefónica a redes tendremos tendremos una dirección. dirección. La próxima vez tendremos 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 Este es el caso de conectar conectarse se mediante mediante una 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 Algunos alumnos, alumnos, afortunada afortunadamente mente los los hacer ping o telnet. Eso es cosa de los gurús informáticos . Algunos 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 mediante el Outlook Outlook Express. Pero esos efectos no son por estar conectados, 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 utiliza para para que el el servidor servidor de
correo envíe los mensajes de correo al usuario. (Internet Relay Chat Irc (Internet
Reenvío Reenvío de Chat por por Internet) Internet) Mediante Mediante este protocol protocolo o una máquina 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 suficiente para comenzar a hablar de lo que puede hacer Visual Basic con todos estos servicios.
LSB
Visual Basic Guía del Estudiante Cap. 18
Pág. 7
LSB
Visual Basic Guía del Estudiante Cap. 18
Pág. 8
Controles de Visual Basic para las redes IP Hemos llegado por fin al Visual Basic puro. Vamos analizar los controles que nos tiene preparados para explotar los recursos de la red. Para cada uno de los servicios anteriores existe un control. Podemos resumirlos en la siguiente lista: Para la conexión: Para http Para FTP Para ara POP3, OP3, SMTP MTP
Control Winsock (Puede implementar con él cualquier servicio) Control WebBrowser , Control Internet Transfer Control Control Internet Transfer Control Cont Contro role less auxi auxililiar ares es 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 controles específicos específicos que Microsoft y otras firmas le han preparado preparado para que Vd. trabaje menos. El control Winsock hay que meterlo en la caja de herramientas. 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 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. establecida. Pero para poder comunicarse 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 personalizar el programa para cada uno de los ordenadores. 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 Devuelve la dirección IP de la máquina local local en el formato formato xxx.xxx.xxx.xx xxx.xxx.xxx.xxxx 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 = No 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 MiVariable = NombredelWinsock.LocalHostName (MiVariable será una variable tipo String)
Determinar el nombre del equipo Para averiguar y cambiar el cambiar el nombre del equipo 1.En la Barra de tareas del equipo, haga click en Inicio. Inicio. 2.En el elemento Configuración, Configuración, haga click en Panel de control . 3.Haga doble clic en el icono Red . Identificación. 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 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 información debe conocer la dirección completa completa del equipo 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 querer enviarle información. Esa aplicación que quiere enviar información información será la aplicación cliente. A poco que nos esforcemos, 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, 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 que nos nos está está espe esperan rando do esa esa máqui máquina na.. Esta Esta infor informa maci ción ón se la intr introd oduc ucim imos os con con la prop propie ieda dad d 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 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 propiedade s 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 propiedad solamente solamente debe utilizarse para poner Winsock Winsock a recibir. Cuando Cuando va a transmitir 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. (Experienci (Experiencia a propia: Si asigna un puerto determinado determinado para transmitir transmitir lo mas probable que le va a pasar es que se le cuelgue el ordenador) Para asegurarse asegurarse de que no ha asignado ningún puerto, 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. UDP. El protocolo establecer previament previamente e una comunicaci comunicación ón. Así de UDP permite enviar y recibir información sin establecer 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. 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 podría ser el comprobar que ordenadores ordenadores de están encendidos encendidos en un determinado determinado momento, envío envío de mensaj mensajerí ería a interna interna a través de Red de Area Local, Local, etc. Pero Pero eso sí, UDP no sirve 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 c liente (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 (Vea mas adelante el método Accept) Accept) También puede LSB
Visual Basic Guía del Estudiante Cap. 18
Pág. 12
ocurrir que el equipo destino o no existe, existe, o reciba reciba la solicitud solicitud de conexión y no la acepte. Veremos 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 e stablecer una conexión TCP T CP.. 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 e scucha 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 original que es el que se queda a la escucha escucha de nuevos intentos de conexión. 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 momento de crear ese LSB Visual Basic Guía del Estudiante Cap. 18 Pág. 13
nuevo winsock. winsock. Esto implica implica que deberemos llevar una lista lista con los índices índices de las instancias instancias creadas 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 ConnectionRequest (IdSolicitud As IdSolicitud As Long ) idSolicitud va a identificar a esa conexión El parámetro idSolicitud va conexión hasta que se cierre. cierre. La identificación identificación la hace el winsock analizando en el datagrama entrante la dirección IP del origen, puerto origen y puerto destino, destino, parámetro parámetros s que no pueden coincidir coincidir al mismo mismo tiempo con los de otra comunicació comunicación. n. Este mecanismo va a permitir que el mismo winsock reciba varias comunicaciones simultáneas y sepa diferenciar una de otra
Metodo Accept Este Este méto método do se util utiliza iza para para acep acepta tarr una una conex conexió ión n entr entran ante te cuan cuando do se está está trata tratando ndo un event evento o ConnectionRequest.. Sólo se usa con el protocolo TCP. TCP. Sintaxis
NombredelW insock.Accept IdSolicitud
Donde IdSolicitud es el núme número ro iden identitififica cado dorr de la soli solici citu tud d de cone conexi xión ón que que pasa pasa el even evento to ConnectionRequest como parámetro. El método Accept debe hacerse hacerse sobre una nueva instancia instancia del control Winsock. Winsock. No es estrictamente 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, equipo, Recomiendo Recomiendo encarecidamen encarecidamente te que la conexión conexión se establezca establezca con una nueva instancia 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 indicando que es una matriz de controles, controles, pero solamente solamente existe existe uno, cuyo índice índice es el 0. Cuando utilizamos el método Load lo que hacemos es añadir un elemento más a esa matriz de controles. Si el control que hemos introducido en el formulario se llamaba Wsk, y le hemos puesto su propiedad Index = 0, para añadir el segundo elemento de esa matriz, que tendrá la propiedad Index = 1, ejecutaremos la siguiente línea de código: Load Wsk (1) Ahora ya tenemos una matriz con dos controles. (Indices 0 y 1) Dejaremos el winsock con índice 0 para seguir recibiendo peticiones de comunicación y ejecutaremos el método Accept sobre el segundo winsock (el de Index = 1) LSB
Wsk (1).Accept IdSolicitud Visual Basic Guía del Estudiante Cap. 18
Pág. 14
A partir de este momento, momento, todo lo que tengamos tengamos que hacer para recoger la información información recibida, recibida, enviar respue respuesta stass al corres correspon ponsal sal,, cerrar cerrar la comuni comunicac cación ión lo haremos haremos con la instan instancia cia creada creada para 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 cone conexi xión ón ante anteri rior or.. Bast Basta a con con decl declar arar ar una una vari variab able le tipo tipo Long Long para para intr introd oduc ucir ir ese ese índi índice ce,, 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. 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 winsock lo haremos en el evento ConnectionRequ ConnectionRequest, est, 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 parte del servido servidorr, ya podemo podemoss conoce conocerr la identi identidad dad del corres correspon ponsal sal mediant mediante e la propie propiedad dad 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. NOT NOTA. Esta Esta prop propie ieda dad d es dist distin inta ta de la de Remo Remote teHo Host st vist vista a mas mas atrá atrás. s. La prop propie ieda dad d 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 aplicacio aplicaciones nes de client cliente, e, después después de establ establece ecerr la conexió conexión n con el método método Connect, esta propiedad contiene la cadena IP del equipo remoto. En las las apli aplica caci cion ones es de serv servid idor or,, desp despué uéss de la lleg llegad ada a de una soli solici citu tud d de llam llamad ada a (even (evento to 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 Sian Sianta taxi xiss LSB
Varia ariabl blet etip ipoi oint nteg eger er = Nom Nombr bred edel elWi Win nsock sock..State Visual Basic Guía del Estudiante Cap. 18
Pág. 15
Nos puede devolver uno de los siguientes valores que corresponden a las siguientes constantes Valor
Constante
Estado
0 1 2 3 4 5 6 7 8 9
sckClosed sckOpen sckListening sckConnectionPending sckResolvingHost sckHostResolved sckConnecting sckConnected sckClosing sckError
Cerrado Abierto Escuchando Conexión pendiente Resolviendo Host Host resuelto Conectando Conectado Cerrando la conexión Ha detectado un error
Propiedad SocketHandle Esta propiedad se usa para utilizarla con las Apis de Windows. Devuelve el manipulador del Winsock. Es de sólo lectura y no está disponible en tiempo de diseño. Sintaxis
Vari ariableTipoLong = Nombred redelWin Winsock(I).SocketHandle
Donde I es el índice del Winsock. Winsock. Como se decía más atrás, atrás, esta propiedad propiedad solamente solamente se emplea usando APIS
Propiedades, Métodos y Eventos del control Winsock usados en la comunicación Hemos visto varias propiedades, métodos y eventos del control Winsock. Hasta ahora hemos visto: Propiedades: Métodos: Eventos
LocalIP, LocalIP, LocalHostName, Protocol, RemoteHost, RemotePort, LocalPort, State Connect, Listen y Accept. ConnectionRequest, 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. TCP. No devuelve ningún valor. Sintaxis
NombredelWinsock(I).SendData datos NombredelWinsock(I).SendData
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, enviar, por ejemplo ejemplo el nombre de una variable variable que los contiene 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, 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 especifica un número inferior inferior a los bytes existentes existentes en el búffer, búffer, el resto de los datos se perderán. Los tipos de datos que se pueden usar en el parámetro tipo son: Byte Single Moneda Cadena
VbByte vbSingle vbCurrency vbString
vbInteger Entero Simple vbDouble Fecha vbDate Matriz de bytes vbArray + vbByte
Long Double Booleano
vbLong vbDouble vbBoolean
El método GetData se suele usar con el evento DataArrival, que incluye incluye el argumento 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 _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 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. 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) SendProgress (bytesEnv As bytesEnv As Long, bytesRest As bytesRest As Long) (NombredelWinsock _ SendProgress
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 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 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: Cons Consta tant nte e
Valor Val or
Desc Descri ripc pció ión n
SckOutOfMemory SckInvalidPropertyValue SckGetNotSupported SckSetNotSupported SckBadState
7 380 394 383 40006
SckInvalidArg
40014
SckSuccess SckUnsupported SckInvalidOp SckOutOfRange SckWrongProtocol
40017 40018 40020 40021 40026
SckOpCanceled SckInvalidArgument
10004 10014
SckWouldBlock
10035
SckInProgress
10036
SckAlreadyComplete
10037
SckNotSocket SckMsgTooBig
10038 10040
SckPortNotSupported SckAddressInUse SckAddressNotAvailable SckNetworkSubsystemFailed SckNetworkUnreachable SckNetReset
10043 10048 10049 10050 10051 10052
SckConnectAborted
10053
SckConnectionReset
10054
Sin memoria El valor de la propiedad no es válido No se puede leer la propiedad La propiedad es de sólo lectura. Protocolo o estado de conexión incorrecto para la solicitud o la transacción requerida. El argumento que se pasó a una función no estaba en el formato correcto o en el intervalo especificado. Correcto Tipo Variant no aceptado. La operación no es válida en el estado actual. El argumento está fuera del intervalo. Protocolo erróneo para la solicitud o la transacción requerida. Se canceló la operación. La dirección solicitada es una dirección de multidifusión, pero el indicador no está activado. El socket es no bloqueante y la operación especificada se bloqueará. Se está efectuando una operación de Winsock bloqueante. Se completó la operación. No se están efectuando operaciones bloqueantes. El descriptor no es un socket. El datagrama es demasiado grande para el búfer y se truncará. El puerto es especificado no es es compatible. Dirección en uso. La dirección no está disponible en la máquina local. Error en en el el su subsistema de de re red. El host no pu puede encontrar la red en este momento. Expiró el tiempo de espera de la conexión antes de establecer SO_KEEPALIVE. SO_KEEPALIVE. La conexión se ha cancelado al sobrepasar el tiempo de espera o por otro error. La conexión se ha restablecido desde el lado remoto.
LSB
Visual Basic Guía del Estudiante Cap. 18
Pág. 18
SckNoBufferSpace SckAlreadyConnected SckNotConnected SckSocketShutdown SckTimedout SckConnectionRefused SckNotInitialized SckHostNotFound SckHostNotFoundTryAgain SckNonRecoverableError SckNoData
10055 10056 10057 10058 10060 10061 10093 11001 11002 11003 11004
No hay espacio disponible en el búfer. El socket ya está conectado. El socket no está conectado. El socket se ha desactivado. Se ha sobrepasado el tiempo de conexión. Se ha forzado el rechazo de la conexión. Es necesario llamar primero a WinsockInit. Respuesta autorizada: host no encontrado. Respuesta no autorizada: host no encontrado. Errores no recuperables. Nombre válido; no hay registro de datos del tipo solicitado.
Evento Close Se produce cuando el equipo remoto cierra la conexión. Las aplicaciones deben usar el método Close para cerrar correctamente una conexión TCP. 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 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
Bind puertoLocal, IPLocal NombreDelWinsock.Bind
Donde: PuertoLocal: IPLO IPLOca cal:l:
Puerto utilizado para realizar una conexión. Dire Direcc cció ión n IP IP loc local al sobr sobre e la la que que se va a est estab able lece cerr la la con conex exió ión. 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 servidor.. Esto Esto es lo más parecido parecido a un servid servidor or de correo, correo, pero no lo es. Le falta falta cumplir 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 necesario disponer de dos winsock winsock en la aplicación. aplicación. Uno, que estará recibiendo recibiendo en un puerto y atendiendo a todas las llamadas entrantes, (Wsk1) y otro, que se usará solamente para enviar informaci información ón a través de las llamadas salientes salientes (Wsk2). (Wsk2). Cada vez que se reciba una llamada 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 nuestros PCs para otro servicio. servicio. En nuestro ejemplo, ejemplo, lo que vamos a hacer es leerlo 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 Textos/Ficheros recibidos) con la parte de la aplicación correspondiente a la recepción, La parte roja (Equipo remoto llamado) corresponde a la parte de transmisión. En la parte azul tenemos el winsock de recepción (Wsk1) y sus instancias. El contenido de cada cuadro de texto y el origen del dato presentado es el siguiente: Maquina local. Pone el nombre de la máquina local. Ip Local. Pone el número IP de la máquina local. Puerto Local. Pone el puerto de recepción asignado a esta aplicación. Protocolo. UDP o TCP. TCP. Puede cambiarse haciendo doble clic en este texto
LSB
Visual Basic Guía del Estudiante Cap. 18
Sistema Sistema Fichero de configuración Pág. 21
Proc. ConnectionRequest RequestID. Parámetro IdSolicitud de la la pr propiedad dad St State ate de del Ws Wsk1 Se an analiza ca cada 10 100 ms ms. Co Con Timer1 Estado. Valor de Ultima máquina remota conectada. Puerto e IP de la última máquina conectada. Se toman de las Instancias activas.
Texto recibido
Fichero recibido
propie propiedad dades es RemotePo RemotePort rt y RemoteHo RemoteHostI stIP P de Wsk1, Wsk1, en el procedimiento ConnectionRequest. 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. 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. 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, enviado, hora de recepción y localizado localizadorr del acuse de recibo. Para limpiar esta caja de texto, se hace clic en el botón Limpia Fichero Rec.
En la parte roja tenemos todo lo relativo a la transmisión, y las cajas de texto pare enviar mensajes de texto y ficheros. Dirección IP Puerto Protocolo Conectar Cerrar Estado
Texto a enviar. Fichero a enviar
LSB
En esta caja se debe introducir el número IP del equipo al que se llama. Se introducirá el puerto en el que escucha el equipo remoto. El puerto por defecto se introduce mediante el fichero de configuración. Protocolo utilizado. (UDP o TCP) se cambia haciendo doble clic en esa caja. Debe usarse el mismo protocolo que el equipo remoto. Haciendo clic en este botón se inicia el proceso de conexión con el equipo remoto. Haciendo clic en este botón se cierra lña conexión existente. Dos etiquetas con el estado del winsock de transmisión. Una, con el valor de la propiedad State, y otra, con la condición de conectado / no conectado. Se hace cada 100 ms. Con el Timer1 Texto que se quiere enviar al equipo remoto. Para comenzar a enviarlo hay que hacer clic sobre el botón Nombre y path del fichero que se quiere enviar. Para buscarlo dentro del disco, hay que hacer clic sobre el botón ··· Para proceder a su envío, se hace clic clic sobre el botón Si existe Texto Texto a enviar y Fichero a enviar, al hacer clic sobre el botón se enviarán ambos
Visual Basic Guía del Estudiante Cap. 18
Pág. 22
Fig. 3 La aplicación puede conectarse consigo misma Es muy sencillo comprobar el funcionamiento correcto de la aplicación conectándose consigo misma. En la Fig. 3 podemos ver el aspecto que toma la interfase gráfica de comunicaciones una vez conectada. Observe la coincidencia de las direcciones IP y los puertos utilizados tanto en la parte roja (equipo remoto) como en la azul (equipo local). De esta forma se pueden probar las funciones del programa sin necesidad de un interlocutor remoto.
Fig. 4 Este es el aspecto final del la aplicación. Vea en el disco de ejemplos el código completo. LSB
Visual Basic Guía del Estudiante Cap. 18
Pág. 23
LSB
Visual Basic Guía del Estudiante Cap. 18
Pág. 24
Visual Basic e Internet (2) Control Microsoft Internet Transfer El control Internet Transfer Microsoft Internet Transfer (Control)
El control Internet Transfer ofrece una implementación de dos de los protocolos más ampliamente utilizados en Internet: Protocolo de transferencia de hipertexto (HTTP) y Protocolo de transferencia de archivos (FTP). Mediante el protocolo HTTP, puede conectarse con servidores de World Wide Web para obtener documentos HTML. Con el protocolo FTP puede iniciar sesiones en servidores FTP para descargar y cargar archivos. Las propiedades UserName y Password permiten iniciar sesiones en servidores privados que requieran autentificación. Por otra parte, puede conectar con servidores FTP públicos y descargar archivos. Los comandos más comunes de FTP, como CD y GET, son compatibles por medio del método Execute. Usar el control Internet Transfer
El control Internet Transfer 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 dispong disponga a de algún servidor servidor Http y Ftp. Ftp. No tienen porqué porqué ser direct directamen amente te a Interne Internet. t. 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 Predete Predetermi rminada nada.. Asume Asume lo que su PC tenga tenga program programado ado en el navegad navegador or de de Internet que tenga por defecto. 1 Direct Directo o a Inte Internet rnet.. Se usa este este valor valor cuando cuando el el Inet Inet se se utili utiliza za para para comu comunic nicar ar con con IcDirect 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á está indica indicando ndo al Inet Inet que la sali salida da hacia hacia Intern Internet et (O (O la red donde donde se 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 Varia ariabl ble e ur l TipoD TipoDato atoss
Variab ariable le tip tipo o strin string g donde donde se guard guardará arán n los los datos datos obte obteni nido doss (Tex (Texto to)) o una una vari variabl able e Var Varia iant nt donde se guardarán los datos obtenidos como matriz de bytes Dirección URL que se desea abrir. Entero Entero que especif especifica ica el tipo tipo de de datos datos.. Acepta Acepta los valores valores 0 (Pre (Predet detemi eminado nado)) para 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. valor.
Ejemplo: En un botón de comando ponemos este código Dim TextoPagina TextoPagina As String TextoPagina = Inet1.OpenURL(TbURL.T Inet1.OpenURL(TbURL.Text, ext, 0) TbTextoPagina = TextoPagina TbTextoPagina TbTextoPagina es un TextBox donde vamos a presentar el valor devuelto. Para el valor www.mae.es valor www.mae.es devolvió esto:
Ministerio de Asuntos Exteriores. España <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
LSB Visual Basic Guía del Estudiante Cap. 18
Pág. 26
El método OpenURL trabaja de forma síncrona, es decir, espera a recibir el contenido d el fichero para ejecutar la línea siguiente del código. Cuando se ejecuta la línea TextoPagina = Inet1.OpenURL(TbURL.T Inet1.OpenURL(TbURL.Text, ext, 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 sola solamen mente te cuan cuando do se termi termina na de recib recibir ir todo todo el cont conten enid ido o o cuan cuando do el Inet Inet gener genera a un error 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 TestoPagina estaría vacía, por lo que TbTextoPagina TbTextoPagina siempre aparecería aparecer ía en blanco. El control Inet es un po co delicado. Como sabrá, la propiedad por defecto de un TextBox 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.T Inet1.OpenURL(TbURL.Text, ext, 0) Pues el Inet, con la primera línea, da error. Debe tomar TbURL como el objeto tipo control. Sale este error: Error 35752 en tiempo de ejecución: La dirección URL está mal generada Es posible que desee saber si ha conectado con la URL solicitada. Eso puede saberlo analizando la el estado de la conexión. Pero no existe ninguna propiedad que se lo indique. Tiene que ir a buscarlo al único procedimiento que tienen el control Internet Transfer: el evento StateChanged
Evento StateChanged Se produce siempre que hay un cambio de estado en la conexión. Aporta el parámetro estado que es un integer. Inet1 _StateChanged(ByVal estado As Integer) estado puede tener uno de estos valores: Constante icNone icHostResolvingHost icHostResolved icConnecting icConnected icRequesting icRequestSent icReceivingResponse icResponseReceived icDisconnecting icDisconnected icError
LSB
Valor
Descripción
0 No hay estado del que informar. 1 El cont contro roll est está á bus busca cand ndo o la la dir direc ecci ción ón IP del del hos hostt esp espec ecifific icad ado. o. 2 El con contr trol ol enco encont ntró ró la dire direcc cció ión n IP IP del del host host espe especi cifi fica cado do.. 3 El con conttrol es está co conectando ndo co con el el eq equipo uipo host. 4 El con contr trol ol cone conect ctó ó cor corre rect ctam amen ente te con con el el equ equiipo host host.. 5 El con contr trol ol está está env enviand iando o una una soli solici citu tud d al al equ equiipo host host.. 6 El con conttrol en envió co corre rrectamente la la so solicitud. 7 El con contr trol ol está está reci recibi bien endo do una una res respu pues esta ta del del equ equip ipo o hos host. t. 8 El cont contro roll rec recib ibió ió corr correc ecta tame ment nte e una una resp respue uest sta a del del equi equipo po host host.. 9 El contr ontrol ol se está está des descone conect ctan ando do del del equi equipo po host host.. 10 El cont contro roll se se des desco cone nect ctó ó cor corre rect ctam amen ente te del del equ equip ipo o host host.. 11 Se prod produj ujo o un un err error or en la comu comuni nica caci ción ón con con el el equ equip ipo o hos host. t. Visual Basic Guía del Estudiante Cap. 18 Pág. 27
12 La soli solici citu tud d se se com compl plet etó ó y se se rec recib ibie iero ron n todo todoss los los dato datos. s. Puede analizar el estado del Inet introduciendo este código en este procedimiento: icResponseCompleted
Private Sub Inet1_StateChanged(ByV Inet1_StateChanged(ByVal al State As Integer) Select Case State Case 0 LSta LState te = "0 - Sin Sin acti activi vida dad" d" ‘Lst ‘Lstat ate e es un Labe Labell dond donde e pres presen enta tamo moss el esta estado do de la cone conexi xión ó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 servidor Ftp. Nos centraremos centraremos primero en conexiones conexiones con servidores Http, y veremos 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. HTTP. Devuelve un string. Sintaxis
Inet1.GetHeader (nombreEnc )
Donde: Inet1 NombreE NombreEnc nc
Nombre del control Inet Opcion Opcional. al. Cade Cadena na que espe especif cifica ica el el encabez encabezado ado que que desea desea recup recuperar erar.. Si no indi indica ca 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 datos obtenidos obtenidos es Fri, Fri, 01 Nov 2002 12:10:5 12:10:51 1 GMT. GMT. Este Este dato dato puede puede servir para 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 MIME-version Devuelve Devuelve la versión versión del protocolo protocolo MIME. Normalme Normalmente nte los servidores servidores no contestan contestan a este este parámetro. Serv Server er Devu Devuel elve ve el tipo tipo del del ser servi vido dorr. (Es (Esta ta resp respue uest sta a tie tiene nen n muc mucho ho peli peligr gro, o, ya que que los los hack hacker erss es lo primero que miran para realzar un ataque) LSB
Visual Basic Guía del Estudiante Cap. 18
Pág. 28
Content-leng Content-length th Devuelve Devuelve la longitud en bytes de los datos que enviará enviará cuando ejecutemos ejecutemos el método OpenURL. Conten Content-t t-type ype Devuel Devuelve ve el tipo tipo de conteni contenido do MIME MIME de los los datos datos.. Last-m Last-modi odifie fied d Devuel Devuelve ve la fecha y la hora hora de la última última modific modificaci ación ón del document documento. o. El formato formato de los datos devueltos devueltos es Wed, 20 Feb 2002 15:26:44 GMT. GMT. Observe que la hora siempre 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 Inet1. Execute url, operación, datos, encabezadosSolicitud encabezadosSolicitud Inet1 URL
operación
Nombre del control Inet (Opcional) Cadena que especifica la dirección URL con la que se debe conectar el control. Si no se especifica ninguna, se usará la dirección contenida en la propiedad URL Opcional. Cadena que especifica el tipo de operación que desea ejecutar. Mas abajo encontrará una lista con las operaciones admitidas. Opcional. Cadena que especifica los datos para las operaciones (vea más abajo).
datos EncabezadosSolicitud
Opcional. Cadena que especifica los encabezados adicionales para enviarlos al servidor remoto. El formato de los mismos es el siguiente: nombre encabezado: valor encabezado vbCrLf
LSB
Visual Basic Guía del Estudiante Cap. 18
Pág. 29
Comandos de HTTP admitidos
Los valores válidos para operación son: Operación GET HEAD
Descripción
Recupera datos de la dirección URL especificada en la propiedad URL. Envía los encabezados de la solicitud. Envía datos al servidor. Los datos están en el argumento datos. Éste es un método alternativo a GET para el que se especifican las instrucciones adicionales en el argumento datos. Operación de colocación. El nombre de la página que se va a reemplazar está ubicado en el argumento datos.
POST PUT
Es difícil probar estos comandos. Normalmente las páginas comerciales no ofrecen los servicios que a nosotros nos gustaría probar. Vea en los ejemplos entregados una aplicación del comando PUT (Que no podrá ensayar en su casa excepto que tenga acceso a un servidor con Password) Vamos a mostrarle un ejemplo ejem plo 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 método se invoca invoca después de ejecutar ejecutar el método método Execute como una operación GET. Sintaxis
Inet1.GetChunk 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, 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 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", "F TP://ftp.microsoft.com", "GET Disclaimer.txt C:\Temp\Disclaimer.txt" C:\Temp\Disclaimer.txt" Inet1.Execute "FTP://ftp.microsoft.com", "PWD" Inet1.Execute “Ftp://10.3.22.119”, “Ftp ://10.3.22.119”, “PUT C:\Prensa\PrensaDia.Tiff /Documento s/PrensaHoy.Tiff” s/PrensaHoy.Tiff” Nota No se admiten nombres de archivos que incluyan espacios incrustados.
Los comandos válidos para FTP son los siguientes: Operación CD archivo1 CDUP CLOSE DELETE archivo1
Descripción
Cambiar directorio. Cambia al directorio especificado en archivo1. Cambiar al directorio superior. Equivale a "CD.." Cierra la conexión FTP actual. Elimina el archivo especificado en archivo1. Directorio. Busca en el directorio especificado en archivo1. Se admiten comodines, pero el host remoto determina la sintaxis. Si no especifica 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. Recupera el archivo remoto especificado en archivo1 y crea un nuevo archivo RECV archivo1 local especificado en archivo2 . Equivale a GET. archivo2 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. Copia el archivo local especificado en archivo1 en el archivo del host remoto SEND archivo1 especificado en archivo2 . Equivale a PUT. archivo2 Devuelve el tamaño del directorio especificado en archivo1. SIZE 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 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 GetChunk para sacar los datos del búffer búffer.. Es el mismo código del Select 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.T TbTextoExecute.Text ext = strData ‘El texto devuelto se introduce en el TextBox TbTextoExecute 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 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 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 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 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. ftp://ftp.microsoft.com/misc1. The zipped SPV files that were being stored here are now located at ftp://ftp.microsoft.com/misc1 ftp://ftp.microsoft.com/misc1 until 07/31/02 at which time these files will no longer be available. In summary: The following folders and/or files at: ftp://ftp.microsoft.com/bussys/...../kb ftp://ftp.microsoft.com/deskapps/...../kb ftp://ftp.microsoft.com/developr/...../kb ftp://ftp.microsoft.com/MISC/ ftp://ftp.microsoft.com/peropsys/...../kb are all located at: ftp://ftp.microsoft.com/MISC1/ and only at: ftp://ftp.microsoft.com/misc/kb will there be HTM files after 7/31/02. Thank you,
[email protected]
LSB
Visual Basic Guía del Estudiante Cap. 18
Pág. 33
Podría enviar un fichero para el servidor. Pero no se lo iba a aceptar. Muchos de los comandos enumerados arriba sólo pueden ejecutarse si el usuario tiene privilegios en el host servidor. Por ejemplo, los sitios FTP anonymous no permiten enviar ficheros, ni eliminar archivos ni directorios.
Transmisión Transmisión asíncrona del método Execute
Al contrario que el método OpenURL, el método método Execute Execute produce produce una transmisi transmisión ón asíncrona de los dato datos. s. Cuan Cuando do se invoc nvoca a el mét método odo Execute, la oper operac ació ión n de tra transfe nsfere renc ncia ia se prod produc uce e 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 cuando el parámet parámetro ro State State del proced procedimi imiento ento StateC StateChan hanged ged haya haya tomado tomado el valor valor 12 (Respu (Respuest esta a 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 desea guard guardar ar en un archiv archivo o los los dato datoss obte obteni nidos dos con con el méto método do OpenURL, puede usar las instrucciones Open, Put y Close, como se muestra en el código siguiente. En este ejemplo se transfiere un archivo binario a una matriz de bytes antes de guardar los datos en disco: Dim strURL As String Dim bData() As Byte LSB
' Variable de datos Visual Basic Guía del Estudiante Cap. 18
Pág. 34
Dim F As Integer ' Variable 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" "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 Variable FreeFile IntFile = FreeFile() strURL = "http://www "http://w ww.microsoft.com/spanish" .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, 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 ser vidores FTP
Hay servidores FTP de dos tipos: públicos y privados. privados. Los servidores 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 iniciar una sesión sesión en un servidor privado, privado, sólo tiene que establecer 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" "CLOSE" ' Cierra 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 hemos vist visto o un poco poco como como func funcio iona na.. No se preo preocu cupe pe si le empi empieza ezan n fall fallan ando do las las prim primera erass aplicaciones que vaya haciendo. Con lo leído hasta aquí no se conoce todavía este control de forma sufic suficie ient nte. e. Le llev llevará ará un buen buen tiemp tiempo o (y much muchos os error errores es en sus sus apli aplica caci cione ones) s) aumen aumenta tarr sus 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 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
Inet1. hInternet 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 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 Inet1. Password = cadena
Propiedad Protocol
Establece el protocolo que desea usar con el método Execute. Sintaxis
Inet1.Protocol Inet1. Protocol = entero
Los valores válidos para entero son: Constante icUnknown icDefault icFTP icReserved icHTTP icHTTPS
Valor
Descripción
0 1 2 3 4 5
Desconocido. Protocolo predeterminado. FTP. Protocolo de transferencia de archivos. Reservado para uso futuro. HTTP. Protocolo de transferencia de hipertexto. HTTP seguro.
Comentarios
Cuando especifica esta propiedad, la propiedad URL se actualiza para mostrar el nuevo valor. Además, si la parte de protocolo de la dirección URL se actualiza, también se modifica la propiedad Protocol para reflejar el cambio. Los métodos OpenURL y Execute también pueden modificar el valor de esta LSB
Visual Basic Guía del Estudiante Cap. 18
Pág. 37
propie propiedad dad.. El cambio cambio de valor valor de esta esta propiedad propiedad no tiene ningún ningún efecto efecto hasta que se invoque 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 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 Inet1.ResponseCode= = código
Propiedad ResponseInfo
Devuelve la descripción del último error que se ha producido. Sintaxis
Inet1.ResponseInfo 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
Inet1.StillExecuting VariableBooleana = Inet1.StillExecuting
Si VariableBooleana = True es que está ocup ado 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" "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 I nternet Transfer
En las tablas siguientes se indican los errores interceptables correspondientes al control Internet Transfer y las constantes asociadas. Constante IcOutOfMemory IcDisconnected IcTypeMismatch IcInvalidPropertyValue IcInetOpenFailed IcOpenFailed IcBadUrlL IcProtMismatch IcConnectFailed IcNoRemoteHost IcRequestFailed IcNoExecute IcBlewChunk IcFtpCommandFailed IcUnsupportedType IcTimeOut IcUnsupportedCommand IcInvalidOperation IcExecuting IcInvalidForFtp IcOutOfHandles IcinetTimeout IcInetTimeout IcExtendedError IcIntervalError IcInvalidURL IcUnrecognizedScheme IcNameNotResolved IcProtocolNotFound IcInvalidOption IcBadOptionLength IcOptionNotSettable IcShutDown IcIncorrectUserName IcLoginFailure IcInetIvalidOperation IcOperationCancelled IcIncorrectHandleType
LSB
Valor
7 10 13 380 3575 35750 0 3575 35751 1 3575 35752 2 3575 35753 3 3575 35754 4 3575 35755 5 3575 35756 6 35757 35757 3575 35758 8 3575 35759 9 3576 35760 0 3576 35761 1 3576 35762 2 3576 35763 3 35764 35764 3576 35765 5 3576 35767 7 3576 35768 8 3576 35768 8 35769 35770 3577 35771 1 35772 3577 35773 3 3577 35774 4 35775 3577 35776 6 3577 35777 7 35778 3577 35779 9 3578 35781 1 3578 35782 2 3578 35783 3 3578 35784 4 Visual Basic
Descripción
"Memoria insuficiente" El equipo ha sido desconectado de la la red. "El tipo no coincide" El valor de de la propiedad dad no es válido No se se pued puede e abri abrirr el cont control rolado adorr de Inte Intern rnet et "No "No se se pue puede de abri abrirr la la dir direc ecci ción ón URL" URL" "La "La dir direc ecci ción ón URL URL está está mal mal gen genera erada da"" "Est "Este e métod método o no es com compa patitibl ble e con con el prot protoc ocol olo" o" "No "No se se pue puede de con conec ecta tarr con con el host host rem remot oto" o" "No "No se ha ha espe especi cififica cado do nin ningún gún equi equipo po rem remot oto" o" "No "No se se pue puede de compl completa etarr la la pet petic ició ión" n" "Debe "Debe ejecut ejecutar ar una una operaci operación ón antes antes de recu recupera perarr datos datos"" "No "No se se pue puede de recu recupe pera rarr dat datos os"" "Fal "Falló ló el coma comand ndo o FTP FTP"" "No "No se se pue puede de forz forzar ar el tipo tipo"" "Se "Se exce excedi dió ó el tiem tiempo po de de espe espera ra"" "El "El coman comando do no no es válid válido o o no no es comp compat atib ible le"" "Argu "Argume ment nto o de de oper operaci ación ón no válid válido" o" "Toda "Todavía vía se está está ejecu ejecutand tando o la la últi última ma peti petició ción" n" "Est "Esta a llam llamada ada no no es vál válid ida a para para una cone conexi xión ón FTP" FTP" "Sin "Sin cont contro rola lado dore ress" "Se "Se ha ha exc exced edid ido o el el tie tiemp mpo o de de esp espera era"" Se ha ha exce excedi dido do el el tiem tiempo po de de espe espera ra Error ex extendido. Error in interno. Dire Direcc cció ión n URL URL no váli válida da.. Patrón no reconocido Nomb Nombre re sin reso resolv lver er.. Prot Protoc ocol olo o no enco encont ntra rado do.. Opción no válida. Long Longititud ud de de opci opción ón inc incor orre rect cta. a. La opci opción ón no no se se pue puede de est estab able lece cer r Apagar Nomb Nombre re de de usu usuar ario io inco incorr rrec ecto to.. Erro Errorr al al ini inici ciar ar la sesi sesión ón.. Oper Operac ació ión n no no váli válida da.. Oper Operac ació ión n ca cancel ncelad ada. a. Tipo Tipo incor incorre rect cto o de cont contro rola lador dor.. Guía del Estudiante Cap. 18 Pág. 39
IcIncorrectHandleState IcNotProxyRequest IcRegistryValueNotFound IcbadRegistryParameter IcNoDirectAccess IcIncorrectPassword IcNoContext IcNoCallback IcRequestPending IcIncorrectFormat IcItemNotFound icCannotConnect icConnectionAborted icConnectionReset icForceEntry icInvalidProxyRequest icWouldBlock icHandleExists icSecCertDateInvalid icSecCertCnInvalid icHttpsToHttpOnRedir icMixedSecurity icChgPostIsNotSecure icHttpToHttpsOnRedir icPostIsNonSecure icClientAuthCertNeeded icInvalidCa icClientAuthNotSetup icAsyncThreadFailed icRedirectSchemeChange
3578 35785 5 35786 3578 35787 7 3578 35788 8 35789 3578 35780 0 35790 3579 35791 1 3579 35792 2 3579 35793 3 3579 35794 4 3579 35795 5 35796 3579 35797 7 35798 3579 35799 9 35800 3580 35802 2 3580 35803 3 3580 35804 4 3580 35806 6 35807 3580 35808 8 3580 35808 8 3580 35809 9 35810 35810 3581 35811 1 3581 35812 2 3581 35813 3 3581 35814 4
icDialogPending
35815
icRetryDialog
3581 35816 6
icHttpsHttpSubmitRedir
35818
icInsertCdrom
35819
icFtpTransferInProgress icFtpDropped
3587 35876 6 3587 35877 7
icFtpNoPassiveMode
35878
icGopherProtocolError icGopherNotFile icGopherDataError icGopherEndOfData icGopherInvalidLocator icGopherIncorrectLocatorT ype icGopherNotGopherPlus icGopherAttributeNotFound icGopherUnknownLocator icHeaderNotFound icHttpDownlevelServer
3589 35896 6 3589 35897 7 3589 35898 8 3589 35899 9 3590 35900 0
Esta Estado do incor incorre rect cto o del del cont contro rola lado dorr. No es es un un pr proxy. Valor alor del del Reg Regis istr tro o no váli válido do.. Pará Paráme metr tro o del regi regist stro ro inco incorr rrec ecto to.. Sin acceso directo. Cont Contra rase seña ña inc incorre orrect cta. a. Sin contexto. Sin Sin dev devol oluc ució ión n de de lla llama mada da.. Peti Petici ción ón pend pendie ient nte. e. Form Format ato o inco incorr rrec ecto to.. No se encu encuen entr tra a el el ele eleme ment nto. o. No se pue puede de conec onecta tarr. Conexi exión anu anulada. Cone Conexi xión ón res restabl tablec ecid ida. a. Forza rzar rei reintento nto. Peti Petici ción ón del del pro proxy xy no váli válida da Con bloqueo. El cont contro rola lado dorr ya exis existe te.. Fech Fecha a de cert certifific icac ació ión n de segu seguri rida dad d no váli válida da.. Núme Número ro de cer certitififica caci ción ón de segu seguri rida dad d no váli válido do.. HTTP HTTPS S a HTTP HTTP al redi rediri rigi girr. Seguridad mi mixta. Camb Cambia iarr la la exp exposi osici ción ón no es segur seguro. o. HTTP HTTPS S a HTTP HTTP al redi rediri rigi girr. La expo exposi sici ción ón no es segu segura ra.. Es nece necesari saria a la certifi certificac cación ión de autor autoriza izació ción n del del clien cliente. te. Auto Autori riza zaci ción ón del del cli clien ente te no váli válida da.. Auto Autori riza zaci ción ón de de clie client nte e no esta establ blec ecid ida. a. Erro Errorr en el subp subpro roce ceso so Asyn Async. c. Camb Cambio io en el patr patrón ón de redi redirec recci ción ón.. La operación está suspendida hasta que cierre un cuadro de diálogo abierto. Inte Intent nte e la la ope opera raci ción ón de nue nuevo vo.. Debe volver a intentar la operación porque falló la comprobación de seguridad de zona La caché de CD instalable requiere un CD-ROM presente en la unidad. FTP: FTP: tran transf sfer eren enci cia a en en cur curso so.. FTP: FTP: cone conexi xión ón inte interr rrum umpi pida da.. Se intentó una conexión en modo pasivo (es decir, la solicitud de conexión original se especificó como INTERNET_FLAG_PASSIVE), pero el servidor no permite ese modo. Goph Gopher er:: Err Error or de prot protoc ocol olo. o. Goph Gopher er:: No No es es un un arc archi hivo vo.. Goph Gopher er:: Err Error or de dato datos. s. Goph Gopher er:: Fi Fin de de los los dato datos. s. Goph Gopher er:: Loca Localiliza zado dorr no vál válid ido. o.
3590 35901 1
Goph Gopher er:: Tip Tipo o de loc local aliza izado dorr inco incorre rrect cto. o.
3590 35902 2 3590 35903 3 3590 35904 4 3591 35916 6 3591 35917 7
Goph Gopher er:: Sin Sin Goph Gopher er Plus Plus.. Goph Gopher er:: No No se se enc encon ontr tró ó el el atr atrib ibut uto. o. Goph Gopher er:: Local Localiz izad ador or desc descono onoci cido. do. HTTP HTTP:: No No se se enc encon ontró tró el enca encabez bezad ado. o. HTTP HTTP:: Ser Servi vido dorr de de baj bajo o niv nivel el..
LSB
Visual Basic Guía del Estudiante Cap. 18
Pág. 40
icHttpInvalidServerRespons e icHttpInvalidHeader icHttpInvalidQueryRequest icHttpHeaderAlreadyExists icHttpRedirectFailed icSecurityChannelError icUnableToCacheFile icHttpCookieNeedsConfirm ation icHttpCookieDeclined
3591 35918 8
HTTP HTTP:: Resp Respue uest sta a del del serv servid idor or no no vál válid ida. a.
3591 35919 9 3592 35920 0 3592 35921 1 3592 35922 2 3592 35923 3 35924
HTTP HTTP:: Enc Encab abez ezad ado o no no vál válid ido. o. HTTP HTTP:: Peti Petici ción ón de de con consu sultlta a no no váli válida da.. HTTP HTTP:: El El enca encabe beza zado do ya exis existe te.. HTTP HTTP:: Fal Falló ló la redi redire recc cció ión. n. Erro Errorr de de seg segur urid idad ad de cana canal.l. No se puede almacenar en caché el archivo. Debe confirmar un cookie suministrado por el servidor antes de que comience la transferencia. No fue fue aceptad aceptado o un cookie cookie sumini suministr strado ado por el servi servidor dor.. No fue posible la conexión con el servidor solicitado. Esto se produjo por el error WSAEHOSTUNREACH recibido desde WinSock. No se pudo pudo alca alcanzar nzar el servid servidor or proxy proxy solici solicitado tado.. Existe un error en el archivo de comandos de configuración automática del proxy, de modo que el archivo de comandos no pudo ejecutarse. No se pudo recibir el archivo de configuración automática del proxy solicitado. Debe confirmar una redirección del nivel de protocolo antes de que pueda comenzar la transferencia. El cert certifific icad ado o no no es es vál válid ido o El cer certitififica cado do ha ha sido sido rev revoc ocad ado. o. Falló la operación que intentó porque no pudo pasar la comprobación de seguridad.
35927 35928 35928
icServerUnreachable
35930
icProxyServerUnreachable
35931 35931
icBadAutoProxyScript
35932
icUnableToDownloadScript
35933
icHttpRedirectNeedsConfir mation icSecInvalidCert icSecCertRevoked icFailedDueToSecurityChec k
35934
LSB
3593 35935 5 3593 35936 6 35937
Visual Basic Guía del Estudiante Cap. 18
Pág. 41
Visual Basic e Internet (3) Control WebBrowser El Control WebBrowser El control WebBrowser es un control DLL-ActiveX (Concretamente el Shdocvw.dll) que se encuentra en la lista de componentes (Proyecto |Componentes) como Microsoft Internet Controls. En la caja de herramientas está representado como un icono que representa un globo del mundo. Forma parte del Internet Explorer de Microsoft. Es decir, es una pieza de las usadas por Microsoft para su navegador de Internet. El WebBrowser puede buscar páginas en la red o en el disco local y presentarlas. Presenta un documento Html y guarda el historial, de forma que siempre puede volver atrás en su navegación. Puede incluso presentar un documento Word ó Excel. Parece en principio que no es práctico realizar un nuevo navegador, usando precisamente la misma “pieza” que usa el Internet Explorer. Para eso ya tenemos el Internet Explorer. Y ciertamente es así. Pero no voy a negar que tienen algo de sugestivo realizar un navegador propio para nuestras aplicaciones, aún a sabiendas que estamos estamos usando una parte del IE. Analizaremo Analizaremoss las propiedades, propiedades, métodos y evento más relevantes, presentaremos el Guia del Estudiante Internet Explorer, 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 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, 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, 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 Devuelve una referencia al formulario o contenedor del WebBrowser WebBrowser.. Funciona Funciona igual que la propiedad Container. Propiedad ReadyState
Devuelve un valor que indica el estado de la operación actual del WebBrowser. Toma uno de los siguientes valores: Valor 0 1 2 3 4
Constante
Descripción
READYSTATE_UNINITIALIZED READYSTATE_LOADING = 1 READYSTATE_LOADED READYSTATE_INTERACTIVE READYSTATE_COMPLETE
Sin operación. Estado por de defecto Cargando sus propiedades El WebBrowser ya está inicializado Está descargando una página Ya ha terminado de descargar la página
Propiedad Type
Devuelve un string con el tipo de documento que está presentando Label1 = brwWebBrowser.Type 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.
NCmdExec NCmdExecOpt Opt (Requerid (Requerido) o) 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 resulta dos
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 identificador identificadores es de comandos, comandos, y OLECMDEXE OLECMDEXECOPT COPT para las opciones. Asi, si quiere imprimir imprimir el contenido del WebBrowser basta con poner la siguiente instrucción: brwWebBrowser.ExecWB brwWebBrowser.ExecWB OLECMDID_PRINT, OLECMDID_PRINT, OLECMDEXECOPT_PROMPTUSER Esto es lo mismo que decir: brwWebBrowser.ExecWB 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 introduciend introduciendo o el método ExecWB aparece la lista con todos los comandos posibles. 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 brwWebBrowser.ExecWB OLECMDID_SAVEAS, OLECMDID_SAVEAS, OLECMDEXECOPT_PROMPTUSER Puede ver la lista completa de los coma comand ndos os en el Expl Explor orad ador or de Objetos (Al que se accede pulsando F2) F2) y que que pres presen enta tamo moss en esta esta pági página na como como reco record rdat atori orio. o. En la imagen está presentando la Clase OLEC OLECMD MDID ID.. Pued Puede e pres presen entar tar la clase OLECMDEXECOPT haciendo clic sobre su línea en el cuadro de la izqu izquie ierd rda. a. Dejo ejo al alum alumno no interesado el trabajo de realizar una lista con todos estos comandos, sus constantes y valores. Nota. Para Para que que apare aparezca zca en el Explorador Explorador de Objetos la lista con todos los comandos OLECMDID debe estar introducido el control WebBrowser en el proyecto.
LSB
Visual Basic Guía del Estudiante Cap. 18
Pág. 44
Método GoBack
Navega hacia atrás dentro de la lista de las páginas visitadas. Método GoForward
Navega hacia delante dentro de la lista de páginas visitadas Método GoHome
Abre la página especificada como página inicial en las opciones del Internet Explorer. Método GoSearch
Abre la página especificada en el Internet Explorer como página de b´squeda (¿) Método Navigate
Abre la página especificada. Sintaxis: NombreWebBrowser.Navigate URL [Flags,] [TargetFrameName,] [PostData,] [Headers] URL Requerido. Una cadena con la dirección del documento a mostrar. Puede ser una URL de una página en la Web, dirección completa de un fichero en el disco, una dirección IP. Flags Opcional. Un valor o constante que determina varias cosas, según se explica en la lista siguiente.
Pueden sumarse dos o más valores de estos. Constante
Valor
Descripción
NavOpenInNewWindow NavNoHistory NavNoReadFromCache NavNoWriteToCache
1 2 4 8
Abre la página en una nueva ventana. No añade la página a la lista del histórico de páginas. No lee de la ca cahé del disco para buscar la la página. No guarda la página abierta en la caché
TargetFrameName
Opcional. Indica la ventana sobre la que mostrará la nueva página. Los valores posibles son:
_blank Presenta el el do documen mento so sobre bre un una nu nueva ve ventana si sin no nombre _pa _pare rent nt Pres Presen enta ta el el docu docume ment nto o en el el cont conten ened edor or inm inmed edia iata tame ment nte e supe superi rior or al al que que tien tienen en el el link link.. _self Presenta el documen mento den dentro de la misma ventana que que tienen el link
Presenta el documento en el frame especificado por el nombre. Si no existe un frame con ese nombre, abre una nueva ventana. PostData Headers
Opcional. Este parámetro es el dato a enviar al servidor durante la transacción HTTP POST (POST es una forma de enviar datos desde un cliente al servidor HTTP) Opcional. En este parámetro se especifican los Header que se envian al servidor para especificar acciones que el cliente desea d esea 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
REFR REFRES ESH_ H_NO NORM RMAL AL
0
Real Realiz iza a un refr refres esco co simp simple le,, en el que que no incl incluy uye e el envi envio o del del header “pragma:nocache” al servidor
REFR REFRES ESH_ H_IF IFEX EXPI PIRE RED D
1
Real Realiz iza a un refre refresc sco o simp simple le si la págin página a ha cadu caduca cado do
REFR REFRE ESH_C SH_COM OMPL PLET ETEL ELY Y
3
Reali ealizza un un refr refres esco co comp comple leto to,, envi envian ando do al serv servid idor or el head header er “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 enviar este este header header cuando cuando el usuario usuario selecc seleccion iona a 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 _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 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 Befo BeforeN reNavi avigat gate2 e2,, exce except pto o que que la naveg navegac ació ión n haya haya sido sido canc cancel elad ada a en aquel aquel.. A cada cada even evento to 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 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 ProgressMax As Long) ProgressChange(ByVal Progress As Long, ByVal 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