P. 1
Capitulo 18 Visual Basic

Capitulo 18 Visual Basic

5.0

|Views: 7,005|Likes:
Published by boyforbaby
Manual Visual Basic 6
Manual Visual Basic 6

More info:

Published by: boyforbaby on Sep 10, 2008
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as DOC, PDF, TXT or read online from Scribd
See more
See less

04/11/2013

pdf

text

original

Sections

Visual Basic - Guía del Estudiante Cap. 18

Visual Basic e Internet

Internet es la tentación en la que actualmente todos los estudiantes quieren caer. Y tienen motivos para
ello. Internet ofrece unas posibilidades de comunicación como nunca las ha habido, lo que brinda unas
oportunidades inmensas al programador si analiza de forma pausada lo que la red le puede ofrecer.
Y digo si las analiza de forma pausada porque esa tentación en la que caen todos los estudiantes es
pretender crear un navegador similar al Internet Explorer o al Netescape, un correo que supere al
Eudora y un programa de FTP que sea capaz de bajarle la Enciclopedia Británica en menos de media
hora. Pero hay que ponerse con los pies en la tierra y comprender que esos programas llevan mucho
trabajo de muchos programadores, mucho tiempo de prueba y unos medios económicos y comerciales
tras ellos que hacen que esos productos tengan que ser necesariamente mejores que lo que puede
hacer un estudiante, por mucho interés e ilusión que ponga.

Sin embargo sí puede ser muy ilustrativo que en este curso nos propongamos la meta de hacer un
programa que sea al tiempo el mejor navegador, el mejor correo (por dos procedimientos), y el mejor
FTP que se pueda concebir, y encima que pueda hacer chat, ping y Telnet. Será el mejor, sin duda,
porque será el único que nos permita aprender a manejar los controles que Visual Basic nos tienen
reservados para los entornos IP.

Nota para alumnos expertos. Si de verdad es Ud. un experto y se lo sabe todo sobre IP puede saltar
directamente al tema Controles de Visual Basic para las redes IP. La colección Guía del Estudiante
está escrita pensando en quien no sabe y quiere saber. Por eso no puedo pasar pos alto conceptos de
nomenclatura de redes IP que se repetirán a lo largo del capítulo, y que seguro que a más de un alumno
le aportarán nuevos conocimientos. Si pese a ser un experto, su humildad le aconseja leérselo, verá que
a lo mejor se le aclara más de un concepto.

Redes IP. Protocolos de comunicación en redes IP

Una red IP es una red de comunicación basada en la transmisión bidireccional de paquetes. Cuando
decimos esto queremos expresar que la comunicación entre dos puntos de la red (entre dos ordenadores
conectados a la red) no es continua, sino que la información se parte en origen en pequeños trozos que
se envían por la red hasta el destino. Una vez allí, se vuelven a poner cada uno de los paquetes en su
sitio para volver a formar el bloque de información que teníamos en origen. Esta técnica permite
compartir al mismo tiempo los recursos de la red por muchos usuarios, sin que ninguno de ellos pueda
bloquear la red por el hecho de enviar una gran cantidad de información. Cada usuario podrá enviar el
mismo número de paquetes por unidad de tiempo (más o menos) por lo tanto quien deba enviar más
información tardará más tiempo que otro que tenga menos información. Y todo sin llegar a bloquear la
red. Eso sí, cuantos más usuarios estén presentes en un determinado momento, más lenta la veremos,
ya que nos corresponderá menos número de paquetes por unidad de tiempo.

El hecho de que la información original se trocee en paquetes que se envían a la red implica poner una
dirección de destino a cada uno de esos paquetes (para saber a quien van dirigidos) y la dirección del
origen, (para saber quien lo envía). De esta forma, la red sabe a quien debe entregar el paquete y el
destino sabe de quien procede. Todo esto lo hace el protocolo IP (Internet Protocol) Esto es como si IP
trabajase solamente de cartero. Coge paquetes en un buzón y los envía a su destinatario sin importarle
el contenido del paquete. Luego veremos lo de la dirección. Lo cierto es que el paquete llega al destino.

A este “nivel” de comunicación le llamaremos Nivel de Red. Si lo prefiere, también le puede llamar Nivel
de Enlace
. Es problema de terminología. No se complique la vida. Al protocolo IP le podemos denominar
por tanto, Protocolo de Red.

Lo que no sabe el destino es el orden en el que tiene que colocar el paquete dentro del bloque total de
información. Debido a que el camino seguido por los paquetes no tiene porqué ser el mismo para todos,
es posible que se reciba primero un paquete que se ha transmitido con posterioridad. Por lo tanto será
necesario poder establecer el número de orden de cada uno de los paquetes dentro del grupo total de
LSB Visual Basic Guía del Estudiante Cap. 18 Pág. 1

paquetes que se han generado para la transmisión. También será necesario en ciertos casos conocer si
el destino ha recibido correctamente el paquete. Estas cosas las hace el Protocolo de Transporte.

El protocolo IP tiene dos protocolos de transporte: el TCP y el UDP.

El TCP establece una comunicación en la que el origen envía un paquete y espera la confirmación del
receptor de que lo ha recibido. Si pasa un determinado tiempo sin recibir esa confirmación vuelve a
enviar el mismo paquete. Pudo haberse perdido el paquete que había enviado o también pudo perderse
la confirmación. En cualquier caso el origen vuelve a enviar y el receptor puede saber perfectamente lo
que ha ocurrido y colocar el paquete en su sitio si se había perdido inicialmente, o descartarlo si la
repetición se ha debido a que se había perdido la contestación. Cada paquete lleva un número que
indica el número de orden de ese paquete dentro del bloque total. El protocolo TCP es muy seguro.
Porque además de lo expuesto, tiene un procedimiento de cálculo de una Checksum que permite saber
si un paquete ha llegado sin ningún tipo de error. Si detecta error en un paquete, pide repetición. También
lleva el número del puerto por el que debe entrar esa información. Verá mas adelante lo que es un
puerto. Mediante el protocolo TCP podemos transportar un fichero enorme sin ningún tipo de error. Es el
que se usa normalmente en las redes IP. Por cierto, ¿Sabe que significa TCP? Transmision Control
Protocol , o como diría Cervantes, Protocolo de Control de Transmisión.

El protocolo UDP (que significa User Datagram Protocol) o Protocolo de Datagramas de Usuario es un
protocolo que envía paquetes sin esperar respuesta. No le preocupa que los paquetes se pierdan. UDP
usa menos recursos y por lo tanto es más rápido. Dependiendo del tipo de información que se envíe, a lo
mejor resulta más práctico enviar paquetes UDP que paquetes TCP. Sobre todo cuando son
informaciones muy cortas, que no sobrepasan la capacidad de un paquete. Dicen que no es un sistema
seguro, pero eso dependerá en gran medida del programa que hagamos. Dado que no es un sistema
seguro, deberemos implementar en el programa la secuencia de envío - confirmación de recibido que
tiene el TCP. Obviamente eso lo va a complicar un poco. Quizás por eso el protocolo usado
generalmente para transmisión de información es el TCP.

Le será muy familiar el TCP/IP. Es la combinación del protocolo TCP con IP. Y es momento ahora de
explicar con un ejemplo simulado como funciona TCP/IP. Imagínese que TCP coge el bloque de
información a transmitir y lo trocea en varios paquetes. A cada uno de ellos le añade el número de orden
que tiene ese paquete dentro del bloque total de información, calcula el Checksum que le corresponde y
se lo anexa. Con esos datos ya somos capaces de volver a restituir el bloque de información completo.
Pero hace falta todavía enviarlo al destinatario. Para ello se lo entregamos al protocolo IP, que lo mete en
un "sobre" donde le apunta la dirección y el remitente. Y lo suelta a la red. La red solamente ve la
dirección y el remitente (Por favor que nadie se lo crea a pies juntillas, no es así exactamente, esto es
solamente un ejemplo) y reencamina el paquete a través de los enrutadores (routers) para hacerlo llegar
a su destino. El destinatario abre el sobre, analiza el Checksum, mira el número de paquete que es,
comprueba que no lo tiene todavía, y entonces crea un pequeño paquete en el que dice que ha recibido
correctamente el paquete con ese número. Lo mete en un sobre IP donde pone como dirección el
remitente del paquete recibido y como remite su propia dirección, y lo envía a la red. Ya se encargará la
red de hacerlo llegar a su destino. Al recibirlo (lo recibe el terminal que estamos llamando origen) ve que
le dan conformidad al paquete enviado, y se despreocupa ya de ese paquete. Otro tema sería que el
destino hubiera recibido el paquete y le saliera el Checksum erróneo. Le mandaría un paquete al origen
comunicándoselo. Entonces el origen se lo volvería a enviar. Lo mismo ocurriría si el origen, pasado
cierto tiempo, no ha recibido confirmación de recibo de un paquete, sea afirmativa o negativa esta
confirmación. El origen vuelve a enviar el paquete, hasta que reciba confirmación de que fue bien
recibido. ¿Se da cuenta ahora de porque, de vez en cuando, parece que se paraliza la red? El orden de
envío de paquetes no tiene porqué ser estricto. No es necesario haber recibido la conformidad del
paquete anterior para enviar el siguiente.

Veamos ahora lo de la dirección. Decíamos que IP pone la dirección del destinatario y del remitente.
Esas direcciones son un conjunto de cuatro números del 0 al 255, separados por un punto. Por ejemplo,
podría ser 195.236.12.56 Así de frías son las direcciones de Internet. Como cada número puede tomar
los valores del 0 al 255, la numeración total de Internet puede llegar a 4.228.250.625 No son mucho
esos cuatro mil doscientos millones. Piense que somos seis mil millones de personas en el mundo. Por
eso ha habido que buscar formas de aprovechar al máximo las direcciones IP. No es objeto de este
curso su estudio, pero digamos que se logra a base de que las redes de área local conectadas a Internet

LSB Visual Basic Guía del Estudiante Cap. 18 Pág. 2

se conectan solamente con un número, e internamente tienen otro (el número interno no coincide con
ninguno de Internet, pero se repite en todas las redes de área local). Otra forma de aprovechar la
numeración es asignar números dinámicamente. Eso ocurre cuando nos conectamos a Internet desde
nuestras casas. Mientras dura la conexión, nuestro ISP (Proveedor de Servicio de Internet) nos cede un
número IP de los que le han asignado a él. Cuando nos desconectamos, ese número se lo da al
siguiente que se conecte. Por eso, en nuestras casas, cuando nos conectamos a través de la conexión
telefónica a redes, no tendremos siempre el mismo número IP.

Esta Dirección IP la usa el Protocolo de Red, es decir El Internet Protocol, que como decíamos antes, era
como un cartero que recoge una carta del Origen y la pone en el Destino sin saber que es lo que
contiene. Ese origen y destino son máquinas, es decir, ordenadores que están conectados a la red.

Nota acerca de las direcciones IP. Existe una serie de direcciones IP que no se pueden usar en
Internet debido a que están reservadas para redes de área local. Esto se hace así para que nunca pueda
haber error entre direcciones. Si asignamos a un equipo interior a una red un número posible en Internet,
un Router que esté separando la red de área local del mundo Internet podría equivocarse y enviar hacia
fuera un paquete interno a nuestra red. Por eso se han reservado esas direcciones. Son estas

De la 10.0.0.0 a la 10.255.255.255
De la 172.16.0.0 a la 172.31.255.255
De la 192.168.0.0 a la 192.168.255.255

Tampoco se pueden usar las direcciones:

0.0.0.0 a la 0.255.255.255 Se usan para llamar al ordenador local principal
255.0.0.0 a la 255.255.255.255 Son direcciones de difusión (transmisión hacia todos los equipos)
127.0.0.0 a la 127.255.255.255 que se usan para funciones internas a la máquina. Técnicamente
hablando se dice que estas direcciones son para LoopBack

IP Versión 6

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

Puertos de Comunicación.

Vamos a ver un concepto nuevo: el Puerto de Comunicación. Hasta ahora hemos hablado de
direcciones de máquina que son las que ve el protocolo IP. Dentro de una máquina podemos tener varios
servicios (Correo, Ftp, www, o cualquier otro programa que nosotros hagamos) Cuando llega uno de
esos paquetes que contienen información, la máquina debe saber reconocer a que servicio está
destinado. Eso lo sabe mediante el Puerto de Comunicación al que va dirigido el paquete.

El puerto de Comunicación no es un puerto físico. Volvemos a lo de siempre: es una forma de hablar. Lo
mismo que la dirección IP nos conduce a una máquina, un puerto nos lleva a un servicio dentro de esa
máquina. Cuando enviamos una carta, el cartero (Protocolo IP) la lleva al domicilio indicado en el sobre.
Imagínese que ese domicilio es en edificio de oficinas. Debemos saber ahora el número de la oficina
donde la debemos entregar. Pero el trabajo del cartero ya finalizó cuando nos ha entregado la carta en
portería. Para saber el número de la oficina debemos abrir el sobre y ver a que oficina está dirigida. De
esto se encarga el Protocolo de Transporte (TCP o UDP) que analiza el contenido del paquete y mira el
valor de dos bytes que indican el número del puerto. Esos dos bytes son los que indicarían el número de
la oficina en ese edificio de nuestro símil postal. Pero tenga en cuenta siempre que el puerto no indica
por donde entra la información a la máquina (entra por la placa de red, que tiene asociado una dirección
IP) sino el servicio (un programa) al que va destinada la información. Dado que el número del puerto se
expresa con dos bytes, los números de puerto posibles son del 1 al 65536.

LSB Visual Basic Guía del Estudiante Cap. 18 Pág. 3

Los 1024 primeros puertos están reservados para distintos servicios de comunicación dentro de la
máquina. No los use para sus aplicaciones. Los servicios más conocidos utilizan los siguientes puertos:

1 - tcpmux

5 - rje

7 - echo

9 - discard

11 - systat

13 - daytime

15 - netstat

17 - qotd

18 - send/rwp19 - chargen20 - 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 - Gopher79 - finger

80 - www-http88 - Kerberos, WWW

95 supdup

96 – DIXIE

98 - linuxconf101 - 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 - SecureID129 - PWDGEN

133 - statsrv135 loc-srv/epmap

137 - netbios-ns 138 - netbios-dgm (UDP)

139 - NetBIOS143 – IMAP

144 NewS

152 BFTP

153 - SGMP

161 - SNMP

175 – vmnet177 - XDMCP178 -NextStep Window Server179 - BGP

180 - SLmail admin

199 - smux

210 - Z39.50

218 – MPP

220 - IMAP3

259 - ESRO

264 -FW1_topo

311 Apple WebAdmin

350 - MATIP type A

351 - MATIP type B

363 - RSVP tunnel

366 - ODMR (On-Demand Mail Relay)
387 - AURP (AppleTalk Update-Based Routing Protocol)

389 - LDAP

407 - Timbuktu

434 - Mobile IP

443 – ssl

444 - snpp, Simple Network Paging Protocol445 - SMB

458 - QuickTime TV/Conferencing

468 - Photuris500 - ISAKMP, pluto

512 - biff, rexec

513 who, rlogin514 - 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 - VEMMI581 Bundle Discovery Protocol593 - MS-RPC608 - SIFT/UFT
626 Apple ASIA

631 - IPP (Internet Printing Protocol)

635 - mountd

(Linux)
636 – sldap

642 - EMSD

648 - RRP (NSI Registry Registrar Protocol)

660 - Apple MacOS Server Admin

666 - Doom

674 - ACAP

687 - AppleShare IP Registry705 - AgentX for SNMP

901 - ISS Real Secure Sensor Port

993 - s-imap995 - s-pop

1080 - SOCKS1085 - WebObjects

1243 - SubSeven

1338 - Millennium Worm

1352 - Lotus Notes

1381 - Apple Network License Manager

1417 - Timbuktu

1418 - Timbuktu

1419 - Timbuktu

1433 - Microsoft SQL Server

1434 - Microsoft SQL Monitor1503 - T.120

1521 - Oracle SQL

1525 - prospero

1526 - prospero

1527 - tlisrv

1645 - RADIUS Authentication

1646 - RADIUS Accounting

1680 - Carbon Copy

1701 - L2TP/LSF

1717 - Convoy

1720 - H.323/Q.931

1723 - PPTP control port

1755 - Windows Media .asf

1758 - TFTP multicast

1812 - RADIUS server

1813 - RADIUS accounting

1818 - ETFTP

1973 - DLSw DCAP/DRAP

1985 - HSRP1999 - Cisco AUTH

2001 - glimpse2049 - NFS

2064 - distributed.net

2065 - DLSw

2066 – DLSw2106 - MZAP2140 – DeepThroat

2301 Compaq Insight Management Web Agents

2336 - Apple UG Control

2427 - MGCP gateway

2504 – WLBS2535 - MADCAP

2543 - sip

2727 - MGCP call agent

2592 netrek

2628 - DICT
2998 - ISS Real Secure Console Service Port3000 - Firstclass

3031 - Apple AgentVU

3128 squid

3130 - ICP

3150 - DeepThroat

3283 - Apple NetAssitant

3288 COPS

3305 – ODETTE

3306 - mySQL3389 - NT Terminal Server

4321 rwhois4333 - mSQL4827 - HTCP

5004 - RTP

5005 – RTP

5010 - Yahoo! Messenger

5060 - SIP

5190 – AIM

5500 - securid5501 - securidprop

5423 - Apple VirtualUser

5631 - PCAnywhere data

5632 - PCAnywhere

5800 – VNC

5801 – VNC

5900 - VNC

5901 - VNC

6000 - X Windows

6667 – IRC

6670 - VocalTec Internet Phone, DeepThroat6699 – napster6776 - Sub7

6970 - RTP

7007 - MSBD, Windows Media encoder

7070 RealServer/QuickTime
LSB Visual Basic Guía del Estudiante Cap. 18 Pág. 4

7648 - CU-SeeMe

7649 - CU-SeeMe

8010 - WinGate 2.1

8080 - HTTP

8181 – HTTP

8383 - IMail WWW

13223 - PowWow

13224 – PowWow

14237 – Palm

14238 - Palm18888 - LiquidAudio

23213 – PowWow

23214 - PowWow

23456 – EvilFTP

26000 – Quake

27001 - QuakeWorld

27015 - Half-Life

27960 - QuakeIII

30029 - AOL Admin

31337 - Back Orifice

40193 – Novell
45000 - Cisco NetRanger postofficed Multicast hidden ICMP Type hidden
32773 - rpc.ttdbserverd

32776 - rpc.spray

32777 - rpc.walld

32779 -

rpc.cmsd
38036 - timestep

(Si quiere una información mayor acerca del número de los puertos, busque en su ordenador un fichero
llamado Services. Ese fichero es el que tiene los números de los puertos correspondientes a cada
servicio instalado en su ordenador.

Dominios. Administración de dominios. Servidores de DNS

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

editorial.laguiadelestudiante.es correo.laguiadelestudiante.es ventas.laguiadelestudiante.es

Observe que las palabras van separadas uno de otro mediante un punto. Existe un dominio para cada
país. (es para España, cu para Cuba, ar para Argentina, etc.) Pero aparte existe una serie de dominios
que no corresponden a ningún país, que se refieren a organizaciones. Por ejemplo, com para
organizaciones comerciales, edu para organismos de educación, gov para organizaciones
gubernamentales, mil para organizaciones militares, int para organismos internacionales, org para otras
organizaciones, net para organizaciones que manejan recursos de la red. Lo de que no pertenecen a
ningún país concreto es solo teórico. La mayoría de ellas (edu, gov, mil) pertenecen a USA. Tampoco se
merecen ninguna crítica por ello. Han sido los artífices de Internet.

Buzones de correo. Un dominio identifica a una máquina. (Un ordenador conectado a la red) Imagínese
que ese ordenador es un servidor de correo. En el caso del ejemplo, correo.laguiadelestudiante.es es
el DNS del ordenador que gestiona el correo de empresa La Guía del Estudiante. En ese ordenador hay
varios buzones para varios usuarios. Uno de los usuarios es Luis Suárez. Parece lógico que su buzón se
llame suarez. Para saber que pertenece a la máquina de correo citada, el nombre de ese buzón deberá
llevar el DNS de esa máquina. No se podrá poner como nombre del buzón
suarez.correo.laguiadelestiante.es ya que suarez no es un dominio, es un buzón. El nombre de un buzón
se separa del DNS mediante el carácter @. Suarez@correo.laguiadelestudiante.es es el nombre de un
buzón único en el mundo. Vamos a avanzar un poco más. Imagínese que ese servidor de correo tiene
varios clientes cuyo apellido es suarez. Deberemos distinguir uno de otro. Para ello basta con seguir el
mismo método que con los dominios. Encadenar varios nombres separados con un punto. Por ejemplo,
podríamos poner cono nombre de buzón luis.suarez@laguiadelestudiante.es Ya puede enviar tranquilamente
sus mensajes a ese buzón. Los enrutadores de internet no se preocuparán de lo que hay a la izquierda
de la @. Buscarán la máquina correo.laguiadelestudiante.es. Una vez que la encuentren, depositarán el
mensaje y será esa máquina quien se encargue de meter ese mensaje en el buzón luis.suarez de su
propiedad.

¿Cómo se traduce el DNS correo.laguiadelestudiante.es al número 217.126.179.96? Mediante unos
aparatos conectados en la red que se denominan servidores de DNS o servidores de dominios. Cuando
una máquina quiere saber a que número corresponde ese DNS se dirige a su servidor de DNS (del que
necesariamente debe conocer su número IP). Le pregunta. Si lo conoce, se lo dice. Si no lo conoce, este
servidor de DNS lo buscará en otros servidores de DNS. Estos harán lo mismo. Hasta que uno de ellos
LSB Visual Basic Guía del Estudiante Cap. 18 Pág. 5

llegue al servidor de DNS que conoce todos los dominios de España (Hay varios. Uno lo tiene Telefónica,
otro una institución llamada RedIris, dependiente del Centro Superior de Investigaciones Científicas CSIC
que es quien tiene las competencias sobre dominios). Ese servidor se lo dirá. Y a partir de ahora ya
puede meter los paquetes TCP en el sobre IP y poner en este la dirección correcta de 4 números que el
servidor DNS le ha facilitado. ¿Se da cuenta por segunda vez de lo que puede hacer que veamos que
la red se paraliza por momentos?

(No me voy a extender más en esto. Ni le puedo remitir al libro Internet - Guía del estudiante, puesto
que ni existe ni existirá. Hay mucha bibliografía sobre el tema que puede consultar

El protocolo TCP/IP no se utiliza solamente en Internet. Las redes de Area Local en su gran mayoría lo
utilizan. Por lo tanto lo que se va a explicar en este capítulo no solamente le va a servir para Internet.
Puede hacer programas que trabajen sobre una red de área local que usa los mismos controles.

Forma de conectarse a Internet

Para conectarse a Internet se necesita que un suministrado de servicios de Internet (ISP) nos conecte.
Internet es una red muy grande, pero que se diferencia muy poco de una red de área local. Solamente en
su extensión. Igual que una red de área local tiene puntos de conexión, Internet también los tiene, pero
esos puntos no están en cualquier esquina. Están precisamente en las dependencias de los ISP,
conectados a la red a través de líneas de comunicación de datos suministradas por una empresa de
telecomunicaciones, que en España es casi con carácter de monopolio, Telefónica. Esos ISP que tienen
la conexión real a Internet deben suministrar una parte de esa conexión a cada usuario que se quiera
conectar. Existen varias formas de hacerlo: ADSL, Conexión telefónica a redes, conexión a través de una
red de área local. Veamos como se conecta de cada una de estas formas, utilizando palabras sencillas,
aunque ello vaya en detrimento de la rigurosidad técnica.

ADSL (Asimetric Data Suscriber Line). Aprovechando una línea telefónica existente, se envía
superpuesto al servicio telefónico unas señales de datos, que no interfieren para nada el uso del teléfono
conectado a esa línea. Esta técnica supone una modulación de los datos sobre dos portadoras a varios
cientos de kilociclos (la frecuencia de la portadora depende del ancho de banda contratado) por lo que
las pérdidas son elevadas. Esto implica que el módem ADSL instalado junto al terminal telefónico deberá
estar muy cerca de la central telefónica desde la que envían los datos (Creo que el máximo son unos 2
kilómetros) Por lo tanto, es difícil instalar esta opción en abonados rurales, o en zonas urbanas con
instalación de cables muy viejas. Pueden contratarse velocidades de 128 a 512 Kbytes en sentido
Usuario -> Internet, y de 256 a 2048 en sentido Internet -> Usuario. Esta asimetría se debe a que
normalmente son mas los datos que se “bajan” que los que se envían, y de esta forma se optimizan los
recursos del sistema. Mediante esta conexión, estamos conectados continuamente a Internet, y
generalmente se tiene un número IP real fijo, pero existen compañías que lo que están enviando a través
de esa conexión de alta velocidad es una toma de una red de área local que a su vez está conectada a
Internet. El número IP, en el caso que le den una número real de Internet, ninguna empresa le garantiza
que se lo vayan a conservar para siempre. Creo que ADSL es hoy por hoy el mejor sistema de conexión
a Internet.

Conexión mediante la Conexión Telefónica a redes. Para esta forma de conexión, los ISP disponen
de varias direcciones IP. Es muy normal que cada ISP tenga uno o varios paquetes 256 direcciones, pero
eso dependerá del trafico real que tenga. Este ISP se va a reservar algunas de esas direcciones para su
uso particular (Una al menos para que se le pueda llamar y comunicarse con otros servidores desde
dentro de la red, otra para el servidor de páginas Web, servidor de correo, servidor DNS si lo tiene, etc.)
y el resto las va a asignar durante el tiempo que dure la conexión a sus clientes. Esta asignación de
direcciones se le denomina asignación dinámica. Cuando nos conectamos a Internet a través de la
conexión telefónica a redes tendremos una dirección. La próxima vez tendremos otra. Por eso, en el
ámbito particular no podemos dar una dirección IP para que nos llamen, ya que es variable. Deberemos
pedir la conexión a nuestro ISP que nos pedirá el nombre de usuario y la contraseña. Esta operación la
realiza el acceso telefónico a redes de Windows. Si coinciden nombre y contraseña con las que tiene el
ISP en su banco de datos, nos asigna un número IP de los que tenga disponible y ya estamos
conectados.

LSB Visual Basic Guía del Estudiante Cap. 18 Pág. 6

Conexión a través de Red de Area Local. Este es el caso de conectarse mediante una RAL o
mediante la mayoría de las conexiones rápidas que nos brindan las compañías de telecomunicación por
cable. En este caso, la conexión a Internet se realiza en un punto de la red, mediante un ordenador o hub
denominado Gateway, Puerta de Enlace o servidor Proxy. La puerta de enlace este tiene dos entradas de
red, una conectada a Internet (A través de un módem o directamente mediante una línea de datos) y otra
conectada a la RAL. En este caso, cada ordenador conectado a la RAL tiene un número IP, pero no es
un número IP de Internet, sino de la red interna. No podremos hacer ping a ese número desde un puesto
conectado directamente a Internet. La transferencia de los datos desde Internet a cada uno de los
ordenadores lo gestiona el software de la puerta de enlace, siendo completamente transparente para el
ordenador que se está conectando.

Una vez conectados, sea cual sea el medio utilizado para ello, ya estamos en la red. Ahora ya podemos
hacer Ping o Telnet a otro ordenador que también esté conectado. No se preocupe por no saber que es
hacer ping o telnet. Eso es cosa de los gurús informáticos. Algunos alumnos, afortunadamente los
menos, creían que estaban conectados a Internet solamente cuando se abría el navegador y les
mostraba la página Web de su ISP. Otros se creían plenamente conectados cuando eran capaces de
abrir su buzón de correo mediante el Outlook Express. Pero esos efectos no son por estar conectados,
sino por Abrir un Servicio.

Esto nos introduce en el concepto de servicio de Internet. La conexión TCP/IP que habíamos establecido
sólo es el soporte de comunicación para que pase por él un servicio. Uno de ellos puede ser el de
páginas Web.(http), otro el de correo, (POP3 y SMTP), otro el de FTP (ftp) , otro el Chat (irc).

Veamos cada uno de ellos.

http (hiper text transfer protocol Protocolo de transferencia de hipertexto) es el servicio para recibir
páginas Web. Las páginas Web están diseñadas de tal forma que contengan muy poca información (para
que se puedan bajar rápidamente) Existen lenguajes que pueden hacer eso (HTML), que con muy poca
información generan páginas preciosas. Pero la poca información que tienen se tiene que cubrir con
algo: con un navegador, que es como un editor de texto pero un poco más complicado, porque es capaz
de componer la página con toda su belleza a partir de esa información tan escasa.

ftp (File Transfer Protocol Protocolo de transferencia de ficheros) Se usa para enviar o recibir fichero
completos. Es el servicio que usa cuando se baja un programa de la red.

SMTP (Single Mail Tranfer Protocol Protocolo simple de transferencia de correo) Se utiliza para enviar
mensajes de correo desde el usuario al servidor de correo y para el tráfico de estos mensajes entre
servidores de correo.

POP 3 (Post Office Protocol 3 Protocolo de la Oficina de Correo) Se utiliza para que el servidor de
correo envíe los mensajes de correo al usuario.

Irc (Internet Relay Chat Reenvío de Chat por Internet) Mediante este protocolo una máquina a la que
han accedido varios usuarios recibe mensajes escritos de uno de ellos y lo retransmite a los demás.)

Cada uno de estos servicios tiene asignado un puerto. Esos puertos puede verlos en la lista que tiene
más atrás. Hay mas servicios, pero con esto creo que tenemos suficiente para comenzar a hablar de lo
que puede hacer Visual Basic con todos estos servicios.

LSB Visual Basic Guía del Estudiante Cap. 18 Pág. 7

LSB Visual Basic Guía del Estudiante Cap. 18 Pág. 8

Controles de Visual Basic para las redes IP

Hemos llegado por fin al Visual Basic puro. Vamos analizar los controles que nos tiene preparados para
explotar los recursos de la red. Para cada uno de los servicios anteriores existe un control. Podemos
resumirlos en la siguiente lista:

Para la conexión:

Control Winsock (Puede implementar con él cualquier servicio)

Para http

Control WebBrowser, Control Internet Transfer Control

Para FTP

Control Internet Transfer Control

Para POP3, SMTP

Controles auxiliares MapiSesion y MAPIMessages

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

Control Winsock

El control WinSock permite conectarse a un equipo remoto e intercambiar datos con los Protocolos UDP
y TCP. Ambos protocolos se pueden usar para crear la comunicación con cualquier servicio de los
expresados anteriormente. Podemos crear también aplicaciones que residan en un servidor al que
accedemos desde varios clientes. Estamos en ese caso creando aplicaciones Cliente - Servidor

El control Winsock podríamos decir que es el control más elemental de los controles que VB dedica a las
redes IP, ya que lo único que hace por sí es conectarnos. No implementa ningún servicio. Eso se lo
tenderemos que hacer nosotros con nuestro programa. Hay controles que nos dan directamente la
conexión y el servicio para el que han sido diseñados (WebBrowser, Internet Transfer Control) Con este
sólo tenemos la conexión, pero con muchos datos y mucho control sobre ella. Quizás por eso este es el
más bonito. Una vez con la conexión establecida, podemos establecer un servicio utilizando código puro
y duro. Tiene esa opción o usar los controles específicos que Microsoft y otras firmas le han preparado
para que Vd. trabaje menos.

El control Winsock hay que meterlo en la caja de herramientas. (Proyecto | Componentes) El nombre
del control es Microsoft Winsock Control 6.0 Solamente se ve en tiempo de diseño. Tiene esta forma:

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

Primera tarea ¿Qué dirección IP tiene mi equipo?

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

Propiedad LocalIP

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

LSB Visual Basic Guía del Estudiante Cap. 18 Pág. 9

Sintaxis

MiVariable = NombredelWinSock.LocalIP

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

Segunda tarea ¿Qué nombre tiene mi equipo?

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

Propiedad LocalHostName

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

Sintaxis

MiVariable = NombredelWinsock.LocalHostName

(MiVariable será una variable tipo String)

Determinar el nombre del equipo

Para averiguar y cambiar el nombre del equipo

1.En la Barra de tareas del equipo, haga click en Inicio.
2.En el elemento Configuración, haga click en Panel de control.
3.Haga doble clic en el icono Red.
4.Haga clic en la pestaña Identificación.
5.El nombre del equipo aparecerá en el cuadro Nombre del equipo o Nombre del PC.

Si desea cambiarlo, teclee el nombre nuevo y haga click en Aceptar. Como es habitual en Windows,
deberá reiniciar el equipo para que tenga efecto el cambio.

Tercera tarea: Establecer el protocolo

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

Propiedad Protocol

Devuelve o establece el protocolo, TCP o UDP

Sintaxis

NombredelControlWinsock.Protocol = Valor

Donde

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

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

Cuarta tarea: Establecer los datos del equipo remoto

Aquí debemos distinguir si queremos enviar información o si deseamos recibirla. Ya tenemos que
comenzar a pensar en un concepto que seguro que le suena: cliente y servidor.

LSB Visual Basic Guía del Estudiante Cap. 18 Pág. 10

Cuando un equipo quiere enviar información debe conocer la dirección completa del equipo al que va a
llamar. La dirección completa es su dirección IP y el puerto al que va dirigida la información. Si el equipo
va a recibir, lo único que debemos decirle es el puerto por el que debe estar escuchando. No necesita
conocer más datos, ya que la dirección IP propia ya la conoce y no necesita conocer ningún dato del
equipo que le va enviar información.

Una aplicación es servidor cuando está escuchando. Así de fácil. (Recuerde el capítulo donde vimos el
DDE, pues el concepto cliente servidor en el tema del establecimiento de la comunicación es el
mismo). Si una aplicación escucha es que otra puede querer enviarle información. Esa aplicación que
quiere enviar información será la aplicación cliente. A poco que nos esforcemos, con este concepto
elemental de aplicación cliente – servidor, una aplicación puede ser cliente en un momento y servidor
en otro. Cuando se hable de aplicación cliente, ya en términos de la función que realiza esa aplicación,
se denomina aplicación servidor a aquella que está dispuesta para enviar información al cliente, o
realizar alguna operación con los datos que el cliente le envía. Pero en este caso, estamos hablando
de cliente – servidor visto desde el punto de vista de las comunicaciones. No se extrañe por lo tanto,
que esa definición tan simple de que una aplicación será servidor cuando está escuchando y cliente
cuando está enviando información.

Para el equipo cliente.

Si queremos enviar información, es decir, si queremos que nuestra aplicación sea una aplicación cliente,
debemos indicarle al Winsock el número IP o el DNS de la máquina con la que queremos conectar. Esto
lo establecemos con la propiedad RemoteHost. También le debemos indicar el número del puerto en el
que nos está esperando esa máquina. Esta información se la introducimos con la propiedad
RemotePort. Nunca le debemos forzar el puerto propio.

Propiedad RemoteHost

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

Sintaxis

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

VariableTipoString = NombredelControlWinsock.RemoteHost

Esta propiedad puede cambiarse en tiempo de ejecución cuantas veces sea necesario, para encaminar
los datos transmitidos a uno u otro equipo remoto.

Otro parámetro que es necesario introducir al Winsock cuando nuestra aplicación es una aplicación
cliente (envía información) es el puerto del equipo remoto al que vamos a enviar información. El puerto
destino dependerá del servicio que estamos implementando en nuestra aplicación. Este parámetro se
introduce en la propiedad RemotePort.

Propiedad RemotePort

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

Sintaxis

NombredelControlWinsock.RemotePort = puerto

En una aplicación cliente (recibe información) no se puede establecer esta propiedad.

Ya tenemos establecidas las propiedades que necesita un control Winsock para enviar datos a un equipo
remoto. Veamos ahora como se establece la comunicación.

LSB Visual Basic Guía del Estudiante Cap. 18 Pág. 11

Para el equipo servidor

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

Propiedad LocalPort

Devuelve o establece el puerto local que desea usar. Es de lectura y escritura, y está disponible tanto en
tiempo de diseño como en tiempo de ejecución.

Esta propiedad solamente debe utilizarse para poner Winsock a recibir. Cuando va a transmitir datos,
aunque puede asignar un puerto determinado para enviarlos es mucho mas prudente dejar al Winsock
que utilice el que quiera. De esta forma se asegura que siempre emitirá a través de un puerto libre.
(Experiencia propia: Si asigna un puerto determinado para transmitir lo mas probable que le va a pasar
es que se le cuelgue el ordenador) Para asegurarse de que no ha asignado ningún puerto, basta con
poner el valor 0 en esta propiedad.

El valor devuelto por esta propiedad es un Long.

Sintaxis

NombredelWinsock.LocalPort = Número

Quinta tarea: Establecer comunicación con el equipo remoto

Para esta tarea también debemos distinguir si vamos a recibir información o a enviarla y el protocolo que
estemos usando (TCP o UDP)

Comunicación por UDP

Vamos a comenzar a ver como nos podemos comunicar con el Winsock a través de UDP. El protocolo
UDP permite enviar y recibir información sin establecer previamente una comunicación. Así de
simple. Una vez establecidos las propiedades descritas mas atrás, tanto el equipo transmisor como el
receptor están ya preparados para trabajar. No hace falta ni poner a escuchar al receptor ni ordenar al
transmisor que contacte con el receptor, cosa que como veremos mas adelante, es necesario cuando se
trata de una comunicación mediante el protocolo TCP.

Esta sencillez del protocolo UDP hace que sea muy válido para una aplicación en la que no sea
imprescindible la seguridad de la comunicación. Un ejemplo de aplicación con transmisión con protocolo
UDP podría ser el comprobar que ordenadores de están encendidos en un determinado momento,
envío de mensajería interna a través de Red de Area Local, etc. Pero eso sí, UDP no sirve para
conectarse a través de Internet, ya que los servidores de Internet cortan el paso a los paquetes UDP.
Pero el hecho de que no sirvan para Internet no debe hacernos olvidar este protocolo tan sencillo para
comunicaciones a través de una RAL interna.

Por lo tanto, para paquetes UDP no hace falta hacer nada para establecer la comunicación con el equipo
remoto, ni para transmitir ni para recibir.

Comunicación por TCP

Aquí sí debemos establecer previamente la conexión. De hecho, se dice de TCP que es un protocolo
orientado a conexión. Veamos que hay que hacer para transmitir y recibir con TCP

Para el equipo cliente (Transmisor)

El equipo que desea enviar datos debe solicitar la conexión. Si existe un equipo destino con dirección IP
y el puerto adecuado, este equipo le contestará. (Vea mas adelante el método Accept) También puede

LSB Visual Basic Guía del Estudiante Cap. 18 Pág. 12

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

La solicitud de conexión se realiza mediante el método Connect

Método Connect

Solicita una conexión con un equipo remoto.

Sintaxis

NombredelcontrolWinsock.Connect hostRemoto, puertoRemoto

Donde hostRemoto es la dirección IP o DNS del equipo remoto, y puertoRemoto es el puerto por donde
esperamos nos esté escuchando ese equipo remoto.

Este método no devuelve ningún dato.

Comentarios
Debe invocar el método Connect cuando intente establecer una conexión TCP.

Para el equipo servidor (Receptor)

Para recibir, primero hace falta poner el Winsock a escuchar, y una vez que reciba una comunicación de
un equipo llamante aceptarla. Para poner a escuchar al Winsock basta con invocar el método Listen.

Método Listen

Crea un socket y lo establece a modo de escucha. (Sólo para conexiones TCP).

Sintaxis

NombredelWinsock.Listen

No lleva ningún argumento ni devuelve ningún valor. Simplemente pone a la escucha al Winsock.

Ya con el Winsock a la escucha, ya está dispuesto para recibir una comunicación. Y no le importará de
quien venga, basta con que lleve su dirección IP y el puerto en el escucha el Winsock.

Cuando el Winsock recibe un intento de conexión se produce el evento ConnectionRequest. Para
aceptarla hay que usar el método Accept, pero aquí es donde se empiezan a complicar (solo un poquito)
las cosas.

Un Winsock solamente puede recibir una comunicación. Por lo tanto, solamente podrá atender a un
corresponsal. Esto no es lo que se busca en la mayor parte de los casos, sino que lo que se pretende es
estar a la escucha, y atender a todas las llamadas que entren, pudiendo atender a dos o más
comunicaciones simultáneamente.

Para lograr esto lo que hacemos es tener un Winsock permanentemente a la escucha para recibir los
sucesivos intentos de conexión de los corresponsales, y una vez que se recibe uno, se crea una
instancia del winsock, y es, con esta instancia, con la que le invocamos el método Accept para
aceptarla. De esta forma tendremos tantas instancias (copias) del winsock como comunicaciones activas,
más el winsock original que es el que se queda a la escucha de nuevos intentos de conexión. Ni que
decir tiene que, una vez terminada la conexión, debe cerrarse la instancia correspondiente a esa
conexión.

La instancia debe crearse en el procedimiento ConnectionRequest del winsock original. La forma de
crear esta instancia es mediante el procedimiento Load. Para ello, el winsock original debe tener la
propiedad Index para que de esta forma sea una matriz de controles, aunque originalmente solo exista
un elemento de esa matriz, con Index = 0. Las instancias van a tener un nombre (Propiedad Name) igual
a la del original, y un índice (Propiedad Index) que tendremos que ponerle en el momento de crear ese
LSB Visual Basic Guía del Estudiante Cap. 18 Pág. 13

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

Evento ConnectionRequest

Se produce en el equipo local cuando el equipo remoto solicita una conexión.

Sólo para aplicaciones de servidor TCP. El evento se activa cuando llega una solicitud de conexión. A
partir de la activación de este evento, las propiedades RemoteHostIP y RemotePort almacenan la
información acerca del cliente.

Este evento pasa como parámetro un número Long con el identificador de la solicitud de conexión. Este
identificador (IdSolicitud) lo genera el servidor (el equipo que recibe) y lo necesitaremos para aceptar la
conexión mediante el método Accept.

NombredelcontrolWinsock_ConnectionRequest (IdSolicitud As Long)

El parámetro idSolicitud va a identificar a esa conexión hasta que se cierre. La identificación la hace
el winsock analizando en el datagrama entrante la dirección IP del origen, puerto origen y puerto
destino, parámetros que no pueden coincidir al mismo tiempo con los de otra comunicación. Este
mecanismo va a permitir que el mismo winsock reciba varias comunicaciones simultáneas y sepa
diferenciar una de otra

Metodo Accept

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

Sintaxis

NombredelWinsock.Accept IdSolicitud

Donde IdSolicitud es el número identificador de la solicitud de conexión que pasa el evento
ConnectionRequest como parámetro.

El método Accept debe hacerse sobre una nueva instancia del control Winsock. No es estrictamente
necesario cuando se está utilizando una conexión en la que sabemos con certeza que no vamos a recibir
más de una llamada. En el caso de que se produzca un nuevo intento de conexión mientras atiende a
una conexión aceptada, además de no poder atenderlo, la experiencia nos dice que se producen
problemas, que terminan generalmente haciendo que el programa no responda e incluso colgando el
equipo, Recomiendo encarecidamente que la conexión se establezca con una nueva instancia del
winsock. Dicho en otras palabras, que el método Accept se ejecute sobre una nueva instancia, aunque la
información de Microsoft esté un poco indefinida en este aspecto.

Veamos como se crea una nueva instancia del control. Se usa el método Load. Para ello, en el Winsock
que colocamos en el proyecto le ponemos, en su propiedad Index el valor 0. Con esto le estamos
indicando que es una matriz de controles, pero solamente existe uno, cuyo índice es el 0. Cuando
utilizamos el método Load lo que hacemos es añadir un elemento más a esa matriz de controles.
Si el control que hemos introducido en el formulario se llamaba Wsk, y le hemos puesto su propiedad
Index = 0, para añadir el segundo elemento de esa matriz, que tendrá la propiedad Index = 1,
ejecutaremos la siguiente línea de código:

Load Wsk (1)

Ahora ya tenemos una matriz con dos controles. (Indices 0 y 1) Dejaremos el winsock con índice 0 para
seguir recibiendo peticiones de comunicación y ejecutaremos el método Accept sobre el segundo
winsock (el de Index = 1)

Wsk (1).Accept IdSolicitud
LSB Visual Basic Guía del Estudiante Cap. 18 Pág. 14

A partir de este momento, todo lo que tengamos que hacer para recoger la información recibida, enviar
respuestas al corresponsal, cerrar la comunicación lo haremos con la instancia creada para esa
conexión. No se nos puede olvidar cerrar el winsock una vez terminada la conexión y descargarlo a
continuación. Para descargarlo utilizamos la instrucción Unload

Unload Wsk(1)

El winsock original lo seguiremos dedicando a recibir nuevas solicitudes de conexión, que a su vez
crearán nuevas instancias del winsock.

En principio no hay problema para que cada nueva instancia lleve un Index incrementado en 1 respecto a
la conexión anterior. Basta con declarar una variable tipo Long para introducir ese índice, y
previsiblemente nunca llegaremos a superar los límites del Long. Ahora bien, es mucho mas elegante
reutilizar los números de las instancias que se van cerrando. Para esto es necesario utilizar una variable
o una matriz, donde llevemos la cuenta de las instancias todavía abiertas del winsock original.

Cada una de las instrucciones anteriores se deberán hacer en los eventos apropiados del winsock. Así,
el crear un nuevo winsock lo haremos en el evento ConnectionRequest, y el descargarlo lo haremos en
el evento Close.
Ya tenemos la conexión establecida. Veamos ahora otras propiedades y métodos que nos permitirán
conocer la identidad del corresponsal y lo que hay que hacer para enviar y recibir información.

Una vez establecida la conexión, mediante el método Connect por parte del cliente, y el método Accept
por parte del servidor, ya podemos conocer la identidad del corresponsal mediante la propiedad

RemoteHostIP

Evento Connect

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

Propiedad RemoteHostIP

Devuelve una cadena de caracteres con la dirección IP del equipo remoto.

NOTA. Esta propiedad es distinta de la de RemoteHost vista mas atrás. La propiedad
RemoteHost es la que se debe introducir antes de realizar la conexión, y puede ser, bien una
dirección IP de cuatro números, o una DNS. RemoteHostIP devuelve el valor de la dirección IP
de cuatro números, una vez que ya se ha establecido la comunicación. Puede consultarse esta
propiedad para conocer el número IP real de un sitio, conociendo solamente su DNS.

En las aplicaciones de cliente, después de establecer la conexión con el método Connect, esta
propiedad contiene la cadena IP del equipo remoto.

En las aplicaciones de servidor, después de la llegada de una solicitud de llamada (evento
ConnectionRequest), esta propiedad contiene la cadena IP del equipo remoto que inició la conexión.

Cuando utiliza el protocolo UDP, después de producirse el evento DataArrival, esta propiedad contiene
la dirección IP del equipo que ha enviado los datos UDP.

Propiedad State

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

Siantaxis

Variabletipointeger = NombredelWinsock.State
LSB Visual Basic Guía del Estudiante Cap. 18 Pág. 15

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

Valor

Constante

Estado

0

sckClosed

Cerrado

1

sckOpen

Abierto

2

sckListening

Escuchando

3

sckConnectionPendingConexión pendiente

4

sckResolvingHost

Resolviendo Host

5

sckHostResolved

Host resuelto

6

sckConnecting

Conectando

7

sckConnected

Conectado

8

sckClosing

Cerrando la conexión

9

sckError

Ha detectado un error

Propiedad SocketHandle

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

Sintaxis

VariableTipoLong = NombredelWinsock(I).SocketHandle

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

Propiedades, Métodos y Eventos del control Winsock usados en la
comunicación

Hemos visto varias propiedades, métodos y eventos del control Winsock. Hasta ahora hemos visto:

Propiedades:

LocalIP, LocalHostName, Protocol, RemoteHost, RemotePort, LocalPort, State

Métodos:

Connect, Listen y Accept.

Eventos

ConnectionRequest, Connect

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

Método SendData

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

Sintaxis

NombredelWinsock(I).SendData datos

DondeNombredelWinsock es el nombre del winsock que debe enviar los datos, I es el índice de ese
control (en el caso de que el winsock sea una instancia de un winsock original, como se explicó más
atrás) y Datos son los datos a enviar, por ejemplo el nombre de una variable que los contiene o la
propiedad text de un textbox donde se han escrito los datos a enviar.

Si los datos a enviar son binarios, deberán enviarse como una matriz de bytes.
Cuando pasa una cadena UNICODE, se convierte a cadena ANSI antes de enviarla a la red.

Método GetData

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

LSB Visual Basic Guía del Estudiante Cap. 18 Pág. 16

Sintaxis

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

Donde

datos es el nombre de la variable donde se almacenarán los datos recogidos
tipo

(Opcional) es el tipo de datos a recuperar (Vea tabla)

longMáx

(Opcional) Tamaño en bytes a recuperar. Si se omite este parámetro, se
recuperan todos los datos existentes en el búffer de recepción. Si se
especifica un número inferior a los bytes existentes en el búffer, el resto
de los datos se perderán.

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

Byte

VbByte

Entero

vbInteger

Long

vbLong

Single

vbSingle

Simple

vbDouble

Double

vbDouble

Moneda

vbCurrency

Fecha

vbDate

Booleano

vbBoolean

Cadena

vbString

Matriz de bytesvbArray + vbByte

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

Evento DataArrival

Se produce cuando llegan nuevos datos. Pasa como parámetro un Long con el número de bytes
recibidos. (NombredelWinsock_DataArrival (bytesTotales As Long)

Este evento no se producirá si no recupera todos los datos con una llamada GetData. Sólo se activa
cuando hay datos nuevos. Utilice la propiedad BytesReceived para comprobar la cantidad de datos
disponibles en cualquier momento.

Propiedad BytesReceived

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

Sintaxis

NombredeWinsock.BytesReceived

Método PeekData

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

Sintaxis

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

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

Evento SendProgress

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

(NombredelWinsock_SendProgress (bytesEnv As Long, bytesRest As Long)

LSB Visual Basic Guía del Estudiante Cap. 18 Pág. 17

Evento SendComplete

Se produce cuando termina una operación de envío. No pasa argumentos.

NombredelWinsock_SendComplete()

Evento Error

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

NombredelWinsock_Error(número As Integer, descripción As String, scode As Long, origen As String,
archivoAyuda as String, contextoAyuda As Long, cancelarVista As Boolean)

El código de error puede tomar estos valores:

Constante

ValorDescripción

SckOutOfMemory

7

Sin memoria

SckInvalidPropertyValue

380

El valor de la propiedad no es válido

SckGetNotSupported

394

No se puede leer la propiedad

SckSetNotSupported

383

La propiedad es de sólo lectura.

SckBadState

40006Protocolo o estado de conexión incorrecto para la
solicitud o la transacción requerida.

SckInvalidArg

40014El argumento que se pasó a una función no estaba en el
formato correcto o en el intervalo especificado.

SckSuccess

40017Correcto

SckUnsupported

40018Tipo Variant no aceptado.

SckInvalidOp

40020La operación no es válida en el estado actual.

SckOutOfRange

40021El argumento está fuera del intervalo.

SckWrongProtocol

40026Protocolo erróneo para la solicitud o la transacción
requerida.

SckOpCanceled

10004Se canceló la operación.

SckInvalidArgument

10014La dirección solicitada es una dirección de multidifusión,
pero el indicador no está activado.

SckWouldBlock

10035El socket es no bloqueante y la operación especificada
se bloqueará.

SckInProgress

10036Se está efectuando una operación de Winsock
bloqueante.

SckAlreadyComplete

10037Se completó la operación. No se están efectuando
operaciones bloqueantes.

SckNotSocket

10038El descriptor no es un socket.

SckMsgTooBig

10040El datagrama es demasiado grande para el búfer y se
truncará.

SckPortNotSupported

10043El puerto especificado no es compatible.

SckAddressInUse

10048Dirección en uso.

SckAddressNotAvailable

10049La dirección no está disponible en la máquina local.

SckNetworkSubsystemFailed

10050Error en el subsistema de red.

SckNetworkUnreachable

10051El host no puede encontrar la red en este momento.

SckNetReset

10052Expiró el tiempo de espera de la conexión antes de
establecer SO_KEEPALIVE.

SckConnectAborted

10053La conexión se ha cancelado al sobrepasar el tiempo de
espera o por otro error.

SckConnectionReset

10054La conexión se ha restablecido desde el lado remoto.
LSB Visual Basic Guía del Estudiante Cap. 18 Pág. 18

SckNoBufferSpace

10055No hay espacio disponible en el búfer.

SckAlreadyConnected

10056El socket ya está conectado.

SckNotConnected

10057El socket no está conectado.

SckSocketShutdown

10058El socket se ha desactivado.

SckTimedout

10060Se ha sobrepasado el tiempo de conexión.

SckConnectionRefused

10061Se ha forzado el rechazo de la conexión.

SckNotInitialized

10093Es necesario llamar primero a WinsockInit.

SckHostNotFound

11001Respuesta autorizada: host no encontrado.

SckHostNotFoundTryAgain

11002Respuesta no autorizada: host no encontrado.

SckNonRecoverableError

11003Errores no recuperables.

SckNoData

11004Nombre válido; no hay registro de datos del tipo
solicitado.

Evento Close

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

El Método Bind

El método Bind sirve para reservar un puerto local cuando estamos trabajando en una comunicación
UDP. Esto puede ser muy útil para evitar que haya otra aplicación escuchando en ese mismo puerto. Hay
que darse cuenta que en UDP puede haber muchas aplicaciones escuchando el mismo puerto ya que al
no establecerse una comunicación, la información que llega pueden tomarla mas de una aplicación. (Es
idéntico al caso en el que una persona hable y muchas escuchan) Si reserva un determinado puerto a un
Winsock, a ese puerto no se le puede conectar otro Winsock a escuchar a partir de ese momento. Hay
que invocar el método Bind antes de invocar el método Listen.

También puede usar el método Bind en una comunicación TCP. Se emplea cuando hay más de un
adaptador de red en el equipo (Un equipo con dos placas de red, y cada una de ellas con un número IP).
Si en ese equipo hay un Winsock, ¿Qué número IP tiene?. Podría tomar uno de los dos indistintamente.
Mediante Bind podemos asignar uno de esos números IP a un Winsock.

Método Bind

Especifica el puerto local y la dirección IP local a usar en las conexiones TCP.

Sintaxis

NombreDelWinsock.Bind puertoLocal, IPLocal

Donde:
PuertoLocal: Puerto utilizado para realizar una conexión.
IPLOcal:

Dirección IP local sobre la que se va a establecer la conexión.

LSB Visual Basic Guía del Estudiante Cap. 18 Pág. 19

LSB Visual Basic Guía del Estudiante Cap. 18 Pág. 20

Programa servidor que recibe varias comunicaciones simultaneas.

Vamos a realizar un ejemplo consistente en un programa servidor cuya misión sea recibir ficheros desde
varios clientes, guardarlos en una base de datos donde apuntará también el origen del fichero y la fecha
de recepción, y que envíe al cliente la conformidad de recepción de ese fichero. En sentido contrario,
una vez identificado al cliente, podrá enviarle los ficheros pendientes que ese cliente tenga depositado en
el servidor. Esto es lo más parecido a un servidor de correo, pero no lo es. Le falta cumplir las
especificaciones. Pero bien estará como ejercicio práctico del winsock.

El programa podrá recibir simultáneamente desde varios corresponsales. Para enviar, podrá hacerlo de
uno en uno, es decir, en un determinado momento solamente podrá estar enviando a otro corresponsal,
aunque podrá enviar, en momentos sucesivos, a cuantos corresponsales estén activos. El envío de
información se podrá hacer simultáneamente a la recepción.

Para lograr esto, es necesario disponer de dos winsock en la aplicación. Uno, que estará recibiendo en
un puerto y atendiendo a todas las llamadas entrantes, (Wsk1) y otro, que se usará solamente para
enviar información a través de las llamadas salientes (Wsk2). Cada vez que se reciba una llamada
entrante, se creará una instancia de Wsk1, que será en realidad la que acepte la llamada usando su
método Connect.

Debemos elegir un puerto para la escucha. A la hora de decidir el número del puerto debemos pensar
que no se pueden usar los 2024 primeros puertos, que el puerto elegido no esté siendo usado de forma
internacional por otro servicio (que no esté registrado a ninguna aplicación a nivel mundial) y que no esté
usado en nuestros PCs para otro servicio. En nuestro ejemplo, lo que vamos a hacer es leerlo de un
fichero de configuración, y colocarlo en un TextBox llamado TbPuertoLocal. De esta forma, al winsock lo
programaremos con el puerto indicado en ese TextBox, y a ese TextBox le llevaremos el dato con la
lectura del fichero de configuración, operación que se realiza durante la carga del formulario. De esta
forma podremos poner en el fichero de configuración el puerto deseado, sin necesidad de variar el
programa.

Ya vamos teniendo una idea de la interfase gráfica necesaria para empezar. Dado el fin didáctico de este
ejemplo, se van a mostrar todos los parámetros que entran a formar parte de la comunicación.

Fig. 2 Aspecto de la parte de la Interfase gráfica de comunicaciones

En esta figura se pueden ver dos partes bien diferenciadas, una en azul, (Máquina Local, Instancias
activas, Textos/Ficheros recibidos) con la parte de la aplicación correspondiente a la recepción, La parte
roja (Equipo remoto llamado) corresponde a la parte de transmisión.

En la parte azul tenemos el winsock de recepción (Wsk1) y sus instancias. El contenido de cada cuadro
de texto y el origen del dato presentado es el siguiente:

Maquina local. Pone el nombre de la máquina local.

Sistema

Ip Local. Pone el número IP de la máquina local.

Sistema

Puerto Local. Pone el puerto de recepción asignado a esta aplicación.

Fichero de configuración

Protocolo. UDP o TCP. Puede cambiarse haciendo doble clic en este texto
LSB Visual Basic Guía del Estudiante Cap. 18 Pág. 21

RequestID. Parámetro IdSolicitud

Proc. ConnectionRequest

Estado. Valor de la propiedad State del Wsk1

Se analiza cada 100 ms. Con Timer1
Ultima máquina remota conectada. Puerto e IP de la última máquina conectada. Se toman de las
propiedades RemotePort y RemoteHostIP de Wsk1, en el
procedimiento ConnectionRequest.
Instancias activas. Se introduce el número de la instancia, requestID, IP remota y puerto remoto de
la conexión que ha forzado la creación de una nueva instancia de Wsk1. Cada
vez que se cierra una instancia, se elimina de esta lista. El número de la ultima
instancia eliminada se presenta el la caja lateral a esta lista.

Texto recibido

Muestra el texto enviado desde el remoto. Se limpia con cada recepción,
y también se puede limpiar con el botón Limpia Texto Rec. Los textos recibidos
se acumulan en un fichero (cuyo nombre y path se determinan en el fichero de
configuración) con indicación de la hora de recepción y equipo remoto que lo
envía.

Fichero recibido

Presenta el nombre y Path del ultimo fichero recibido. El nombre del
fichero es una composición del número de instancia del winsock que lo recibe
(tres cifras) y de la fecha y hora del sistema (iiiyyyymmddhhmmss.Dat). El path
se introduce en el fichero de configuración. Paralelamente se crea otro fichero
con nombre idéntico y extensión .Env con los datos relativos al equipo remoto
que lo ha enviado, hora de recepción y localizador del acuse de recibo. Para
limpiar esta caja de texto, se hace clic en el botón Limpia Fichero Rec.

En la parte roja tenemos todo lo relativo a la transmisión, y las cajas de texto pare enviar mensajes de
texto y ficheros.

Dirección IP

En esta caja se debe introducir el número IP del equipo al que se llama.

Puerto

Se introducirá el puerto en el que escucha el equipo remoto. El puerto por
defecto se introduce mediante el fichero de configuración.

Protocolo

Protocolo utilizado. (UDP o TCP) se cambia haciendo doble clic en esa caja.
Debe usarse el mismo protocolo que el equipo remoto.

Conectar

Haciendo clic en este botón se inicia el proceso de conexión con el equipo
remoto.

Cerrar

Haciendo clic en este botón se cierra lña conexión existente.

Estado

Dos etiquetas con el estado del winsock de transmisión. Una, con el valor de la
propiedad State, y otra, con la condición de conectado / no conectado. Se hace
cada 100 ms. Con el Timer1

Texto a enviar.

Texto que se quiere enviar al equipo remoto. Para comenzar a enviarlo hay que
hacer clic sobre el botón

Fichero a enviar

Nombre y path del fichero que se quiere enviar. Para buscarlo dentro del disco,
hay que hacer clic sobre el botón ··· Para proceder a su envío, se hace clic sobre
el botón Si existe Texto a enviar y Fichero a enviar, al hacer clic sobre el
botón se enviarán ambos

LSB Visual Basic Guía del Estudiante Cap. 18 Pág. 22

Fig. 3 La aplicación puede conectarse consigo misma

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

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

LSB Visual Basic Guía del Estudiante Cap. 18 Pág. 23

LSB Visual Basic Guía del Estudiante Cap. 18 Pág. 24

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->