Winsock (Control)

El control Winsock, invisible para el usuario, proporciona un acceso sencillo a los servicios de red TCP y UDP. Pueden usarlo los programadores de Microsoft Access, Visual Basic, Visual C++ o Visual FoxPro. Para escribir aplicaciones de servidor o de cliente no necesita comprender los detalles de TCP ni llamar a las API de Winsock de nivel inferior. Si establece las propiedades y llama a los métodos del control, podrá conectar fácilmente con un equipo remoto e intercambiar datos en las dos direcciones.

Conceptos básicos de TCP

El Protocolo de control de transferencia (TCP) le permite crear y mantener una conexión con un equipo remoto. Mediante la conexión, ambos equipos pueden intercambiar datos entre sí.

Si está creando una aplicación de cliente, debe saber el nombre del equipo servidor o su dirección IP (propiedad RemoteHost), así como el puerto (propiedad RemotePort) en el que está "escuchando". Después, llame al método Connect.

Si está creando una aplicación de servidor, establezca el puerto (propiedad LocalPort) en el que escuchar y llame al método Listen. Cuando el equipo cliente solicite una conexión, se producirá el evento ConnectionRequest. Para completar la conexión, llame al método Accept del evento ConnectionRequest.

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.

Conceptos básicos de UDP

El Protocolo de datagramas de usuarios (UDP) es un protocolo sin conexiones. A diferencia de las operaciones de TCP, los equipos no establecen una conexión. Asimismo, una aplicación UDP puede ser cliente o servidor.

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.


No se encuentra el tema

No se halló el tema correspondiente. A continuación enumeramos algunas posibles razones y sus soluciones:

  • El archivo (.chm) que contiene el tema de destino no se encuentra en la ubicación esperada.

    Solución: vuelva a ejecutar la instalación de la Biblioteca MSDN.

  • El archivo (.chm) que contiene el tema actual o el de destino no está actualizado y el vínculo ya no es válido.

    Solución: instale la última versión de la Biblioteca MSDN.

  • El CD de la Biblioteca MSDN no está en la unidad de CD-ROM.

    Solución: inserte el CD en la unidad.


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( )

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Argumentos

Ninguno


Connect (Evento, control Winsock)

Ocurre cuando se ha completado una operación de conexión.

Sintaxis

objeto.Connect()

El marcador de posición objeto representa una expresión de objeto que da como resultado un control Winsock.

Comentarios

Use el evento Connect para confirmar que se ha realizado con éxito la conexión.


ConnectionRequest (Evento)

Se produce 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. 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)

La sintaxis del evento ConnectionRequest consta de las siguientes partes:

Parte | Descripción
objeto | Expresión de objeto que da como resultado un objeto de la lista Se aplica a.
IdSolicitud | Identificador de la solicitud de conexión entrante. Este argumento se debería pasar al método Accept de la segunda instancia del control.

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.


DataArrival (Evento)

Se produce cuando llegan nuevos datos.

Sintaxis

objeto_DataArrival (bytesTotales As Long)

La sintaxis del evento DataArrival consta de las siguientes partes:

Parte | Descripción
objeto | Expresión de objeto que da como resultado un objeto de la lista Se aplica a.
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.


Error (Evento, control Winsock Control)

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)

La sintaxis del evento Error consta de las siguientes partes:

Parte | Descripción
objeto | Expresión de objeto que da como resultado un objeto de la lista Se aplica a.
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:

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)

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

Sintaxis

objeto_SendComplete

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Argumentos

Ninguno


SendProgress (Evento)

Se produce mientras se están enviando datos.

Sintaxis

objeto_SendProgress (bytesEnv As Long, bytesRest As Long)

La sintaxis del evento SendProgress consta de las siguientes partes:

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.


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

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

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:

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

   ' Pasa el valor del parámetro IdSolicitud
   ' al método Accept.
   Winsock1.Accept IdSolicitud
End Sub

Debe usar el método Accept en una nueva instancia del control (distinta de la que está en estado de escucha.)


Ejemplo del método Accept, evento ConnectionRequest

El ejemplo ilustra el código necesario para conectar un control Winsock mediante el protocolo TCP. El código se ejecuta en el equipo que acepta la solicitud de conexión. El parámetro RequestID identifica la solicitud. Ésta se pasa al método Accept, que acepta la solicitud en particular.

Private Sub WinsockTCP_ConnectionRequest _
(requestID As Long)
   If Winsock1.State <> sckClosed Then Winsock1.Close
   Winsock.Accept IdSolicitud
End Sub


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

La sintaxis del método Bind consta de las siguientes partes:

Parte | Descripción
objeto | Expresión de objeto que da como resultado un objeto de la lista Se aplica a.
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.


Close (Método, control Winsock)

Cierra una conexión TCP o un socket en escucha para las aplicaciones de cliente y de servidor.

Sintaxis

objeto.Close

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Argumentos

Ninguno

Valor devuelto

Ninguno


Connect (Método)

Solicita una conexión con un equipo remoto.

Sintaxis

objeto.Connect hostRemoto, puertoRemoto

La sintaxis del método Connect consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
hostRemoto | Requerido. El nombre del equipo remoto al que se va a conectar.
puertoRemoto | El puerto del equipo remoto al que se va a conectar.

Valor de retorno

Ninguno

Comentarios

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


Ejemplo del método GetData (Control Winsock, evento DataArrival

En este ejemplo se utiliza el método GetData del evento DataArrival de un control Winsock. Cuando se produce el evento, el código llama al método GetData para recuperar los datos y los almacena en una variable de cadena. Después se escriben los datos en un control TextBox.

Private Sub Winsock1_DataArrival _
(ByVal bytesTotales As Long)
   Dim strData As String
   Winsock1.GetData strData, vbString
   Text1.Text = Text1.Text & strData
End Sub


GetData (Método, control Winsock)

Recupera el bloque actual de datos y lo almacena en una variable de tipo Variant.

Valor devuelto

Ninguno

Sintaxis

objeto.GetData datos, [tipo,] [longMáx]

La sintaxis del método GetData consta de las siguientes partes:

Parte | Descripción
objeto | Expresión de objeto que da como resultado un objeto de la lista Se aplica a.
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:

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.


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

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

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:

Parte | Descripción
objeto | Expresión de objeto que da como resultado un objeto de la lista Se aplica a.
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:

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)

Envía datos a un equipo remoto.

Valor devuelto

Ninguno

Sintaxis

objeto.SendData datos

La sintaxis del método SendData consta de las siguientes partes:

Parte | Descripción
objeto | Expresión de objeto que da como resultado un objeto de la lista Se aplica a.
datos | Datos que desea enviar. Para los datos binarios, debería usar matrices de datos.

Comentarios

Cuando pasa una cadena UNICODE, se convierte a cadena ANSI antes de enviarla a la red.


BytesReceived (Propiedad)

Devuelve la cantidad de datos recibidos (que están actualmente en el búfer de recepción). Utilice el método GetData para recuperar los datos.

Es de sólo lectura y no está disponible en tiempo de diseño.

Sintaxis

objeto.BytesReceived

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valor devuelto

Long


LocalHostName (Propiedad)

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

Sintaxis

objeto.LocalHostName

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valor devuelto

String


LocalIP (Propiedad)

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

Sintaxis

objeto.LocalIP

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

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.

  • En el servidor, es el puerto local en el que se escuchará. Si especifica el puerto 0, se utiliza un puerto seleccionado de forma aleatoria. Después de llamar al método Listen, la propiedad contiene el puerto actual seleccionado.

Sintaxis

objeto.LocalPort = largo

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

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.


Protocol (Propiedad, control Winsock)

Devuelve o establece el protocolo, TCP o UDP, utilizado por el control Winsock.

Sintaxis

objeto.Protocol [=protocolo]

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores

Los valores de protocolo son:

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)

Devuelve la dirección IP del equipo remoto.

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

  • 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 envía los datos UDP.

Sintaxis

objeto.RemoteHostIP

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

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

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Tipo de datos

Long

Comentarios

Esta propiedad se diseñó para pasarla a las API de Winsock.


State (Propiedad, control 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

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Tipo de datos

Integer

Valores

Los valores de la propiedad State son:

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