Professional Documents
Culture Documents
Aplicaciones posibles
• Crear una aplicación cliente que recopile información del usuario antes de enviarla a un
servidor central.
• Crear una aplicación servidora que funcione como un punto central de recopilación de
datos procedentes de varios usuarios.
Seleccionar un protocolo
• UDP es un protocolo sin conexión y la transacción entre los dos equipos es como pasar
una nota: se envía un mensaje desde un equipo a otro, pero no existe una conexión
explícita entre ambos. Además, el tamaño máximo de los datos en envíos individuales
está determinado por la red.
2. ¿Será muy grande el tamaño de los datos (como en el caso de los archivos de
imágenes o sonidos)? Una vez establecida la conexión, el protocolo TCP mantiene la
conexión y asegura la integridad de los datos. No obstante, esta conexión utiliza más
recursos del sistema, por lo que resulta más "cara".
3. ¿Se enviarán los datos de forma intermitente o en una sesión? Por ejemplo, si está
creando una aplicación que avisa a equipos específicos cuando se han completado
ciertas tareas, el protocolo UDP puede ser el más apropiado. Este protocolo es también el
más adecuado para enviar pequeñas cantidades de datos.
Establecer el protocolo
Código:
Winsock1.Protocol = sckTCPProtocol
Después de encontrar el nombre del equipo, puede usarlo como el valor de la propiedad
RemoteHost.
Cuando crea una aplicación que utilice el protocolo TCP, deberá decidir primero si la
aplicación va a ser un servidor o un cliente. Si crea un servidor, la aplicación va a
"escuchar" en el puerto designado. Cuando el cliente realice una solicitud de conexión, el
servidor puede aceptar la solicitud y completar así la conexión. Una vez realizada la
conexión, el cliente y el servidor se podrán comunicar entre sí sin problemas.
Código:
Private Sub Form_Load()
' Establece la propiedad LocalPort en un entero.
' Después invoca el método Listen.
tcpServer.LocalPort = 1001
tcpServer.Listen
frmClient.Show ' Muestra el formulario del cliente.
End Sub
tcpServer.GetData strData
txtOutput.Text = strData
End Sub
Código:
Private Sub Form_Load()
' El nombre del control Winsock es tcpClient.
' Nota: para especificar un host remoto, puede usar
' la dirección IP (como "121.111.1.1") o
' el nombre "descriptivo" del equipo, como se muestra aquí.
tcpClient.RemoteHost = "NombreEquipoRemoto"
tcpClient.RemotePort = 1001
End Sub
tcpClient.GetData strData
txtOutput.Text = strData
End Sub
El código anterior crea una aplicación cliente-servidor sencilla. Para probar las dos
aplicaciones al mismo tiempo, ejecute el proyecto y haga clic en Conectar. A
continuación, escriba texto en el control TextBox txtSendData de cualquiera de los
formularios y el mismo texto aparecerá en el control TextBox txtOutput del otro formulario.
Código:
Private intMax As Long
Crear una aplicación UDP es todavía más sencillo que crear una aplicación TCP, ya que
el protocolo UDP no requiere una conexión explícita. En la aplicación TCP anterior hubo
que establecer explícitamente un control Winsock para "escuchar", mientras que el otro
debía iniciar la conexión con el método Connect.
En cambio, el protocolo UDP no requiere una conexión explícita. Para enviar datos entre
los dos controles, se deben completar tres pasos (en ambos lados de la conexión):
Código:
Private Sub Form_Load()
' El nombre del control es udpPeerA.
With udpPeerA
' IMPORTANTE: asegúrese de cambiar el valor de
' RemoteHost al nombre de su equipo.
.RemoteHost= "IgualB"
.RemotePort = 1001 ' Puerto al que conectar.
.Bind 1002 ' Enlaza al puerto local.
End With
Código:
Private Sub Form_Load()
' El nombre del control es udpPeerB.
With udpPeerB
' IMPORTANTE: asegúrese de cambiar el valor de
' RemoteHost al nombre de su equipo.
.RemoteHost= "IgualA"
.RemotePort = 1002 ' Puerto al que conectar.
.Bind 1001 ' Enlaza al puerto local.
End With
End Sub
Para probar el ejemplo, presione F5 para ejecutar el proyecto y escriba texto en el control
TextBox txtSend de cualquiera de los formularios. El mismo texto aparecerá en el control
TextBox txtOutput del otro formulario.
Tal como ilustra el código anterior, debe invocar el método Bind al crear una aplicación
UDP. Este método "reserva" un puerto local para uso del control. Por ejemplo, al enlazar
el control al número de puerto 1001, ninguna otra aplicación podrá usar ese puerto para
"escuchar". Esto puede ser muy útil si desea impedir que otra aplicación utilice ese
puerto.
Winsock (Control)
Una vez establecida la conexión, los equipos pueden enviar y recibir datos. Para enviar
datos, llame al método SendData. Siempre que se reciben datos, se produce el evento
DataArrival. Llame al método GetData del evento DataArrival para recuperar los datos.
Para transmitir datos, establezca primero la propiedad LocalPort del equipo cliente. El
equipo servidor sólo necesita establecer RemoteHost a la dirección de Internet del equipo
cliente y la propiedad RemotePort al mismo puerto que la propiedad LocalPort del equipo
cliente, y llamar al método SendData para comenzar a enviar mensajes. Después, el
equipo cliente utiliza el método GetData del evento DataArrival para recuperar los
mensajes enviados.
Propiedades Winsock(control)
BytesReceived (Propiedad)
Sintaxis
objeto.BytesReceived
Valor devuelto
Long
LocalHostName (Propiedad)
Sintaxis
objeto.LocalHostName
Valor devuelto
String
LocalIP (Propiedad)
Sintaxis
objeto.LocalIP
Tipo de datos
String
LocalPort (Propiedad)
Devuelve o establece el puerto local que desea usar. Es de lectura y escritura, y está
disponible en tiempo de diseño.
• En el cliente, designa el puerto local desde el que desea enviar los datos. Especifique el
puerto 0 si la aplicación no necesita un puerto específico. En este caso, el control
seleccionará un puerto de forma aleatoria. Una vez establecida la conexión, éste es el
puerto local utilizado para la conexión TCP.
Sintaxis
objeto.LocalPort = largo
Tipo de datos
Long
Comentarios
Para establecer dinámicamente conexiones entre dos equipos, se suele usar el puerto 0.
Por ejemplo, un cliente que desea que un servidor le "devuelva la llamada" puede usar el
puerto 0 para obtener un nuevo número de puerto (aleatorio), que pueda proporcionar al
equipo remoto para ese propósito.
Sintaxis
objeto.Protocol [=protocolo]
Valores
Los valores de protocolo son:
Código:
Constante Valor Descripción
sckTCPProtocol 0 Predeterminado. Protocolo TCP.
sckUDPProtocol 1 Protocolo UDP.
Valor devuelto
Ninguno
Comentarios
Debe cerrar el control (con el método Close) antes de que se pueda restablecer esta
propiedad.
RemoteHostIP (Propiedad)
Sintaxis
objeto.RemoteHostIP
Tipo de datos
String
SocketHandle (Propiedad)
Devuelve un valor que corresponde al controlador de socket que utiliza el control para
comunicarse con la capa Winsock. Es de sólo lectura y no está disponible en tiempo de
diseño.
Sintaxis
objeto.SocketHandle
Tipo de datos
Long
Comentarios
Esta propiedad se diceñó para pasarla a las API de Winsock.
Devuelve el estado del control, expresado como un tipo enumerado. Es de sólo lectura y
no está disponible en tiempo de diseño.
Sintaxis
objeto.State
Tipo de datos
Integer
Valores
Código:
Constante Valor Descripción
sckClosed 0 Predeterminado. Cerrado
sckOpen 1 Abierto
sckListening 2 Escuchando
sckConnectionPending 3 Conexión pendiente
sckResolvingHost 4 Resolviendo host
sckHostResolved 5 Host resuelto
sckConnecting 6 Conectando
sckConnected 7 Conectado
sckClosing 8 El equipo está cerrando la conexión
sckError 9 Error
Sintaxis
objeto.Index
Comentarios
La propiedad Index se establece de forma predeterminada al orden de creación de los
objetos en una colección. El índice para el primer objeto de una colección será siempre
uno (1).
Name (Propiedad)
Sintaxis
objeto.Name
Comentarios
El nombre predeterminado para objetos nuevos es el tipo de objeto y un entero único. Por
ejemplo, el primer objeto Form nuevo será Form1, un objeto MDIForm nuevo será
MDIForm1 y el tercer control TextBox que cree en un formulario será Text3.
La propiedad Name de un objeto debe comenzar por una letra y puede tener un máximo
de 40 caracteres. Puede incluir números y caracteres de subrayado (_), pero no signos
de puntuación ni espacios en blanco. Un formulario no puede tener el mismo nombre que
otro objeto público como Clipboard, Screen o App. Aunque el valor de la propiedad Name
puede ser una palabra clave, un nombre de propiedad o el nombre de otro objeto, esto
puede crear conflictos en el código.
Puede crear un conjunto de controles del mismo tipo si establece la propiedad Name al
mismo valor. Por ejemplo, cuando establece el nombre de todos los botones de opción en
un grupo como MiOpc, Visual Basic asigna valores únicos a la propiedad Index de cada
control con el fin de distinguir unos de otros en la matriz. Dos controles de distinto tipo no
pueden tener el mismo nombre.
Nota Aunque Visual Basic usa a menudo el valor de la propiedad Name como valor
predeterminado de las propiedades Caption, LinkTopic y Text, el cambio de una de estas
propiedades no afecta a las otras.
El error es causado por la forma en que se guardan los nombres de los módulos en el
archivo del proyecto; el procedimiento para cambiar nombres dentro del archivo del
proyecto no distingue mayúsculas de minúsculas, mientras que el procedimiento para leer
nombres al cargar el proyecto sí las distingue.
Sintaxis
objeto.Object[.propiedad | .método]
Código:
Parte Descripción
Comentarios
Utilice esta propiedad para especificar un objeto que desea usar en una tarea de
Automatización.
Para usar en una tarea de Automatización el objeto devuelto por la propiedad Object,
utilice las propiedades y los métodos de dicho objeto. Para obtener información acerca de
las propiedades y los métodos compatibles con un objeto, vea la documentación de la
aplicación que creó el objeto.
Parent (Propiedad)
Devuelve el formulario, objeto o colección que contiene un control u otro objeto o
colección.
Sintaxis
objeto.Parent
Comentarios
Utilice la propiedad Parent para tener acceso a las propiedades, los métodos o los
controles del primario de un objeto. Por ejemplo:
Código:
MiBotón.Parent.MousePointer = 4
No hay ninguna relación entre la propiedad Parent y la propiedad MDIChild. Sin embargo,
hay una relación primario-secundario entre un objeto MDIForm y cualquier objeto Form
que tenga su propiedad MDIChild establecida a True.
Devuelve o establece el equipo remoto al que un control envía datos, o aquél del que los
recibe. Puede indicar el nombre de host, como "http://FTP://ftp.microsoft.com" o como una
cadena de dirección IP en el formato con puntos, como "100.0.1.1".
Sintaxis
objeto.RemoteHost = cadena
Código:
Parte Descripción
objeto Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
cadena El nombre o la dirección del equipo remoto.
Comentarios
Cuando se especifica esta propiedad, la propiedad URL se actualiza para mostrar el
nuevo valor. Además, si se actualiza la parte de host de la dirección URL, esta propiedad
también se modifica para reflejar el nuevo valor.
Sintaxis
objeto.RemotePort = puerto
Código:
Parte Descripción
objeto Control Winsock
puerto El puerto con el que conectar. El valor predeterminado de esta propiedad es 80.
Tipo de dato
Integer
Comentarios
Al establecer la propiedad Protocol, en la propiedad RemotePort se establece
automáticamente el puerto predeterminado correspondiente a cada protocolo. Los
números de puerto predeterminados se muestran en la siguiente tabla:
Código:
Puerto Descripción
80 HTTP, utilizado habitualmente para las conexiones con el World Wide Web.
21 FTP.
Devuelve o establece una expresión que almacena cualquier dato adicional necesario
para su programa. A diferencia de otras propiedades, Visual Basic no usa el valor de la
propiedad Tag; puede usarla para identificar objetos.
Sintaxis
objeto.Tag [= expresión]
Código:
Parte Descripción
objeto Casi cualquier objeto de Visual Basic
expresión Cualquier texto
Comentarios
Puede usar esta propiedad para asignar una cadena de identificación a un objeto sin
afectar a los valores de ninguna otra de sus propiedades o causar efectos colaterales. La
propiedad Tag es útil cuando necesita comprobar la identidad de un control o de un
objeto MDIForm que se pasa como variable a un procedimiento.
Sugerencia
Cuando cree una nueva instancia de un formulario, asigne un valor único a la propiedad
Tag.
Nota
La propiedad Tag es de tipo Variant para las colecciones de controles ActiveX como
objetos Toolbar Button, TreeView Node, ListView ListItem y ColumnHeader, ImageList
ListImage, TabStrip Tab y StatusBar Panel. Puede usar la propiedad Tag para pasar
valores, pero no está permitido pasar objetos.
Winsock(Metodos)
Accept (Método)
Sólo para las aplicaciones de servidor TCP. Este método se utiliza para aceptar una
conexión entrante cuando se está tratando un evento ConnectionRequest.
Sintaxis
objeto.Accept IdSolicitud
Tipo de datos
Long
Valor devuelto
Ninguno
Comentarios
El método Accept se utiliza en el evento ConnectionRequest. El evento
ConnectionRequest tiene un argumento, el parámetro RequestID, que debe pasarse al
método Accept. A continuación se muestra un ejemplo:
Código:
Private Sub Winsock1_ConnectionRequest _
(ByVal requestID As Long)
' Cierra la conexión si está abierta mediante la
' comprobación de la propiedad State.
If Winsock1.State <> sckClosed Then Winsock1.Close
Debe usar el método Accept en una nueva instancia del control (distinta de la que está en
estado de escucha.)
Bind (Método)
Especifica el puerto local y la dirección IP local a usar en las conexiones TCP. Utilice este
método si tiene múltiples adaptadores de protocolo.
Sintaxis
objeto.Bind puertoLocal, IPLocal
Código:
Parte Descripción
objeto Control Winsock
puertoLocal Puerto utilizado para realizar una conexión.
IPLocal Dirección local de Internet utilizada para realizar una conexión.
Comentarios
Debe llamar al método Bind antes de llamar al método Listen.
Cierra una conexión TCP o un socket en escucha para las aplicaciones de cliente y de
servidor.
Sintaxis
objeto.Close
Argumentos
Ninguno
Valor devuelto
Ninguno
GetData (Método, control Winsock)
Valor devuelto
Ninguno
Sintaxis
objeto.GetData datos, [tipo,] [longMáx]
Código:
Parte Descripción
objeto Control Winsock
datos Dónde se almacenarán los datos recuperados después de que el método termine
correctamente. Si no hay suficientes datos disponibles para el tipo requerido, datos se
establecerá a Vacío.
tipo Opcional. Tipo de datos a recuperar, como se muestra en Valores.
longMáx Opcional. Especifica el tamaño deseado cuando se recibe una matriz de bytes
o una cadena. Si se omite este parámetro para las matrices de bytes o las cadenas, se
recuperarán todos los datos disponibles. Si se proporciona para tipos de datos que no
sean matrices de bytes o cadenas, se pasa por alto el parámetro.
Valores
Los valores de tipo son:
Código:
Descripción Constante
Byte VbByte
Entero VbInteger
Largo VbLong
Simple VbSingle
Doble vbDouble
Moneda vbCurrency
Fecha vbDate
Booleano vbBoolean
SCODE vbError
Cadena vbString
Matriz de bytes vbArray + vbByte
Comentarios
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.
Ejemplo del método GetData (Control Winsock, evento DataArrival)
Código:
Private Sub Winsock1_DataArrival _
(ByVal bytesTotales As Long)
Dim strData As String
Winsock1.GetData strData, vbString
Text1.Text = Text1.Text & strData
End Sub
Listen (Método)
Crea un socket y lo establece a modo de escucha. Este método sólo funciona en las
conexiones TCP.
Sintaxis
objeto.Listen
Argumentos
Ninguno
Valor devuelto
Ninguno
Comentarios
El evento ConnectionRequest se produce cuando hay una conexión entrante. Cuando se
está tratando un evento ConnectionRequest, la aplicación debería usar el método Accept
(en una nueva instancia del control) para aceptar la conexión.
PeekData (Método)
Similar a GetData, excepto que PeekData no elimina los datos de la cola de entrada. Este
método sólo funciona en las conexiones TCP.
Sintaxis
objeto.PeekData datos, [tipo,] [longMáx]
La sintaxis del método PeekData consta de las siguientes partes:
Código:
Parte Descripción
objeto Control Winsock
datos Almacena los datos recuperados después de que el método acaba
satisfactoriamente. Si no hay suficientes datos disponibles para el tipo solicitado, datos se
establecerá a Vacío.
tipo Opcional. Tipo de los datos a recuperar, como se describe en Valores. Valor
predeterminado: vbArray + vbByte.
longMáx Opcional. Longitud que especifica el tamaño deseado cuando se recibe una
matriz de bytes o una cadena. Si falta este argumento para las matrices de bytes o
cadenas, se recuperan todos los datos disponibles. Si se proporciona para otros tipos de
datos que no sean matrices de bytes o cadenas, se pasa por alto el argumento.
Valores
Los valores de tipo son:
Código:
Tipo Constante
Byte VbByte
Entero VbInteger
Largo VbLong
Simple VbSingle
Doble VbDouble
Moneda vbCurrency
Fecha VbDate
Booleano VbBoolean
SCODE VbError
Cadena VbString
Matriz de bytes VbArray + vbByte
Valor devuelto
Ninguno
Comentarios
Si el tipo se especifica como vbString, la cadena de datos se convierte a UNICODE antes
de devolverla al usuario.
SendData (Método)
Valor devuelto
Ninguno
Sintaxis
objeto.SendData datos
Comentarios
Cuando pasa una cadena UNICODE, se convierte a cadena ANSI antes de enviarla a la
red.
Winsock(eventos)
Close (Evento)
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.
Sintaxis
objeto_Close( )
Argumentos
Ninguno
Sintaxis
objeto.Connect()
Comentarios
Use el evento Connect para confirmar que se ha realizado con éxito la conexión
ConnectionRequest (Evento)
• Sólo para aplicaciones de servidor TCP. El evento se activa cuando llega una solicitud
de conexión. Las propiedades RemoteHostIP y RemotePort almacenan la información
acerca del cliente después de que se ha activado el evento.
Sintaxis
objeto_ConnectionRequest (IdSolicitud As Long)
Comentarios
El servidor puede decidir si acepta o no la conexión. Si no se acepta la conexión entrante,
el equipo (cliente) obtendrá el evento Close. Utilice el método Accept (en una nueva
instancia del control) para aceptar una conexión entrante.
Código:
Private Sub WinsockTCP_ConnectionRequest _
(requestID As Long)
If Winsock1.State <> sckClosed Then Winsock1.Close
Winsock.Accept IdSolicitud
End Sub
DataArrival (Evento)
Sintaxis
objeto_DataArrival (bytesTotales As Long)
Código:
Parte Descripción
objeto Objeto Winsock
bytesTotales Long. Cantidad total de datos que se puede recuperar.
Comentarios
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.
Ejemplo del método GetData (Control Winsock, evento DataArrival
Código:
Private Sub Winsock1_DataArrival _
(ByVal bytesTotales As Long)
Dim strData As String
Winsock1.GetData strData, vbString
Text1.Text = Text1.Text & strData
End Sub
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).
Sintaxis
objeto_Error(número As Integer, descripción As String, scode As Long, origen As String,
archivoAyuda as
String, contextoAyuda As Long, cancelarVista As Boolean)
Código:
Parte Descripción
objeto Control Winsock
número Entero que define el código de error. Vea las constantes más abajo, en
Valores.
descripción Cadena que contiene la información del error.
scode SCODE largo.
origen Cadena que describe el origen del error.
archivoAyuda Cadena que contiene el nombre del archivo de ayuda.
contextoAyuda Contexto del archivo de ayuda.
cancelarVista Indica si se cancelará la vista del mensaje de error. El valor
predeterminado es False, que indica mostrar el cuadro de mensaje de error
predeterminado. Si no desea usar el cuadro de mensaje predeterminado, establezca
cancelarVista a True.
Valores
Los valores de número son:
Código:
Constante Valor Descripción
sckOutOfMemory 7 Sin memoria
sckInvalidPropertyValue 380 El valor de la propiedad no es válido.
sckGetNotSupported 394 No se puede leer la propiedad.
sckSetNotSupported 383 La propiedad es de sólo lectura.
sckBadState 40006 Protocolo o estado de conexión incorrecto para la
solicitud o la transacción requerida.
sckInvalidArg 40014 El argumento que se pasó a una función no estaba en el
formato correcto o en el intervalo especificado.
sckSuccess 40017 Correcto.
sckUnsupported 40018 Tipo Variant no aceptado.
sckInvalidOp 40020 La operación no es válida en el estado actual.
sckOutOfRange 40021 El argumento está fuera del intervalo.
sckWrongProtocol 40026 Protocolo erróneo para la solicitud o la transacción
requerida.
sckOpCanceled 10004 Se canceló la operación.
sckInvalidArgument 10014 La dirección solicitada es una dirección de
multidifusión, pero el indicador no está activado.
sckWouldBlock 10035 El socket es no bloqueante y la operación especificada
se bloqueará.
sckInProgress 10036 Se está efectuando una operación de Winsock
bloqueante.
sckAlreadyComplete 10037 Se completó la operación. No se están efectuando
operaciones bloqueantes.
sckNotSocket 10038 El descriptor no es un socket.
sckMsgTooBig 10040 El datagrama es demasiado grande para el búfer y se
truncará.
sckPortNotSupported 10043 El puerto especificado no es compatible.
sckAddressInUse 10048 Dirección en uso.
sckAddressNotAvailable 10049 La dirección no está disponible en la máquina local.
sckNetworkSubsystemFailed 10050 Error en el subsistema de red.
sckNetworkUnreachable 10051 El host no puede encontrar la red en este
momento.
sckNetReset 10052 Expiró el tiempo de espera de la conexión antes de
establecer SO_KEEPALIVE.
sckConnectAborted 10053 La conexión se ha cancelado al sobrepasar el tiempo
de espera o por otro error.
sckConnectionReset 10054 La conexión se ha restablecido desde el lado
remoto.
sckNoBufferSpace 10055 No hay espacio disponible en el búfer.
sckAlreadyConnected 10056 El socket ya está conectado.
sckNotConnected 10057 El socket no está conectado.
sckSocketShutdown 10058 El socket se ha desactivado.
sckTimedout 10060 Se ha sobrepasado el tiempo de conexión.
sckConnectionRefused 10061 Se ha forzado el rechazo de la conexión.
sckNotInitialized 10093 Es necesario llamar primero a WinsockInit.
sckHostNotFound 11001 Respuesta autorizada: host no encontrado.
sckHostNotFoundTryAgain 11002 Respuesta no autorizada: host no encontrado.
sckNonRecoverableError 11003 Errores no recuperables.
sckNoData 11004 Nombre válido; no hay registro de datos del tipo
solicitado.
SendComplete (Evento)
Sintaxis
objeto_SendComplete
Argumentos
Ninguno
SendProgress (Evento)
Sintaxis
objeto_SendProgress (bytesEnv As Long, bytesRest As Long)
Código:
Parte Descripción
objeto Expresión de objeto que da como resultado un objeto de la lista Se aplica a.
bytesEnv Número de bytes enviados desde la última vez que se activó el evento.
bytesRest Número de bytes que esperan en el búfer de envío a ser enviados.