[Aportes indexados] Tutorial del control winsock

Estado
Cerrado para nuevas respuestas.

Shura

Dragón Ancestral Lvl 2
FUENTE: Microsoft Developed Network (MSDN)


El control WinSock permite conectarse a un equipo remoto e intercambiar datos con el Protocolo de datagramas de usuario (UDP) o con el Protocolo de control de transmisión (TCP). Ambos protocolos se pueden usar para crear aplicaciones cliente-servidor. Al igual que el control Timer, el control WinSock no tiene una interfaz visible en tiempo de ejecución.

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.

• Crear una aplicación de "conversación".


Seleccionar un protocolo

Cuando utilice el control WinSock, primero debe tener en cuenta es si se va a usar el protocolo TCP o el protocolo UDP. La principal diferencia entre los dos radica en su estado de conexión:

• TCP es un protocolo basado en la conexión y es análogo a un teléfono: el usuario debe establecer una conexión antes de continuar.

• 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.

La naturaleza de la aplicación que esté creando determinará generalmente qué protocolo debe seleccionar. He aquí varias cuestiones que pueden ayudarle a seleccionar el protocolo adecuado:

1. ¿Necesitará la aplicación la confirmación por parte del cliente o el servidor cuando se envíen o reciban datos? Si es así, el protocolo TCP requiere una conexión explícita antes de enviar o recibir datos.

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

Para establecer el protocolo que la aplicación va a usar: en tiempo de diseño, en la ventana Propiedades, haga clic en Protocolo y seleccione sckTCPProtocol o sckUDPProtocol. También puede establecer la propiedad Protocol en el código, como se muestra a continuación:
Código:
Winsock1.Protocol = sckTCPProtocol
 
 
Determinar el nombre del equipo
 
Para conectarse a un equipo remoto, deberá saber su dirección IP o su "nombre descriptivo". La dirección IP está formada por un conjunto de tres dígitos separados por puntos (xxx.xxx.xxx.xxx). En general, es mucho más fácil recordar el nombre descriptivo de un equipo.
Para encontrar el nombre del equipo:

1. En la Barra de tareas del equipo, haga clic en Inicio.

2. En el elemento Configuración, haga clic en Panel de control.

3. Haga doble clic en el icono Red.

4. Haga clic en la ficha Identificación.

5. El nombre del equipo aparecerá en el cuadro Nombre del equipo.

Después de encontrar el nombre del equipo, puede usarlo como el valor de la propiedad RemoteHost.


Conceptos básicos de conexión con el protocolo TCP

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.

Para crear un servidor rudimentario, realice los siguientes pasos:

Para crear un servidor TCP

1. Cree un nuevo proyecto EXE estándar.

2. Cambie el nombre del formulario predeterminado a frmServer.

3. Cambie el título del formulario a "Servidor TCP".

4. Cree un control Winsock en el formulario y cambie su nombre a tcpServer.

5. Agregue dos controles TextBox al formulario. Llame al primero txtSendData y al segundo txtOutput.

6. Agregue el código siguiente al formulario.
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
 
Private Sub tcpServer_ConnectionRequest _
(ByVal requestID As Long)
  ' Comprueba si el estado del control es cerrado. 
  ' De lo contrario, cierra la conexión antes de 
  ' aceptar la nueva conexión.
  If tcpServer.State <> sckClosed Then _
    tcpServer.Close
 
  ' Acepta la petición con el parámetro 
  ' requestID.
  tcpServer.Accept requestID
End Sub
 
Private Sub txtSendData_Change()
  ' El control TextBox llamado txtSendData 
  ' contiene los datos que se van a enviar. Siempre
  ' que el usuario escribe en el cuadro de texto, 
  ' se envía la cadena mediante el método SendData.
  tcpServer.SendData txtSendData.Text
End Sub
 
Private Sub tcpServer_DataArrival _
(ByVal bytesTotal As Long)
  ' Declara una variable para los datos entrantes. 
  ' Invoca el método GetData y establece la propiedad
  ' Text de un control TextBox llamado txtOutput 
  ' con los datos.
  Dim strData As String
 
  tcpServer.GetData strData
  txtOutput.Text = strData
End Sub
Los procedimientos anteriores permiten crear una aplicación de servidor sencilla. No obstante, para completar el ejemplo, deberá crear también una aplicación cliente.

Para crear un cliente de TCP

1. Agregue un nuevo formulario al proyecto y llámelo frmClient.

2. Cambie el título del formulario a "Cliente TCP".

3. Agregue un control Winsock al formulario y llámelo tcpClient.

4. Agregue dos controles TextBox a frmClient. Llame al primero txtSend y al segundo txtOutput.

5. Cree un control CommandButton en el formulario y llámelo cmdConnect.

6. Cambie el título del control CommandButton a Connect.

7. Agregue el código siguiente al formulario.
Importante Asegúrese de que cambia el valor de la propiedad RemoteHost al nombre descriptivo del equipo.
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
 
Private Sub cmdConnect_Click()
  ' Invoca el método Connect para iniciar
  ' una conexión.
  tcpClient.Connect
End Sub
 
Private Sub txtSendData_Change()
  tcpClient.SendData txtSend.Text
End Sub
 
Private Sub tcpClient_DataArrival _
(ByVal bytesTotal As Long)
      Dim strData As String
 
  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.


Aceptar más de una solicitud de conexión

El servidor básico comentado anteriormente sólo acepta una solicitud de conexión. No obstante, es posible aceptar varias solicitudes de conexión con el mismo control si crea una matriz de controles. En este caso, no necesita cerrar la conexión; basta con crear una nueva instancia del control (estableciendo la propiedad Index) e invocar el método Accept de la nueva instancia.

El código que se muestra a continuación presupone que existe un control Winsock en un formulario llamado sckServer y que su propiedad Index tiene el valor 0, por lo que el control forma parte de una matriz de controles. En la sección Declaraciones se declara una variable intMax a nivel de módulo. En el evento Load del formulario, intMax tiene establecido el valor 0 y la propiedad LocalPort del primer control de la matriz tiene el valor 1001. Después, se invoca el método Listen en el control, convirtiéndolo en el control "que escucha". A medida que llega cada solicitud de conexión, el código comprueba si el índice es 0 (el valor del control "que escucha"). Si es así, este control aumenta la variable intMax y utiliza ese número para crear una nueva instancia del control. Esta instancia se utiliza para aceptar la solicitud de conexión.
Código:
Private intMax As Long
 
Private Sub Form_Load()
   intMax = 0
   sckServer(0).LocalPort = 1001
   sckServer(0).Listen
End Sub
 
Private Sub sckServer_ConnectionRequest _
(Index As Integer, ByVal requestID As Long)
   If Index = 0 Then
      intMax = intMax + 1
      Load sckServer(intMax)
      sckServer(intMax).LocalPort = 0
      sckServer(intMax).Accept requestID
      Load txtData(intMax)
   End If
End Sub
Conceptos básicos del protocolo UDP

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

1. Establezca la propiedad RemoteHost con el nombre del otro equipo.

2. Establezca la propiedad RemotePort con la propiedad LocalPort del segundo control.

3. Invoque el método Bind especificando la propiedad LocalPort que se va a usar. (Este método se trata detenidamente más adelante.)

Debido a que ambos equipos se pueden considerar "iguales" en la relación, se podría llamar una aplicación de igual a igual. Para demostrarlo, el siguiente código crea una aplicación de "conversación" que permite que dos personas "conversen" en tiempo real:

Para crear una aplicación UDP de igual a igual

1. Cree un proyecto EXE estándar.

2. Cambie el nombre del formulario predeterminado a frmPeerA.

3. Cambie el título del formulario a "Igual A".

4. Cree un control Winsock en el formulario y llámelo udpPeerA.

5. En la página Propiedades, haga clic en Protocolo y cambie el protocolo a UDPProtocol.

6. Agregue dos controles TextBox al formulario. Llame al primero txtSend y al segundo txtOutput.

7. Agregue el siguiente código al formulario.
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
 
  frmPeerB.Show                 ' Muestra el segundo formulario.
End Sub
 
Private Sub txtSend_Change()
' Envía texto en cuanto se escribe.
udpPeerA.SendData txtSend.Text
End Sub
 
Private Sub udpPeerA_DataArrival _
(ByVal bytesTotal As Long)
Dim strData As String
udpPeerA.GetData strData
txtOutput.Text = strData
End Sub
Para crear una segunda aplicación UDP de igual a igual

1. Agregue un formulario estándar al proyecto.

2. Cambie el nombre del formulario a frmPeerB.

3. Cambie el título del formulario a "Igual B".

4. Cree un control Winsock en el formulario y llámelo udpPeerB.

5. En la página Propiedades, haga clic en Protocolo y cambie el protocolo a UDPProtocol.

6. Agregue dos controles TextBox al formulario. Llame al primero txtSend y al segundo txtOutput.

7. Agregue el siguiente código al formulario.
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
 
Private Sub txtSend_Change()
' Envía texto en cuanto se escribe.
udpPeerB.SendData txtSend.Text
End Sub
 
Private Sub udpPeerB_DataArrival _
(ByVal bytesTotal As Long)
Dim strData As String
udpPeerB.GetData strData
txtOutput.Text = strData
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.


Acerca del método Bind

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.

El método Bind también ofrece un segundo argumento opcional. Si hay más de un adaptador de red presente en el equipo, el argumento IPlocal permite especificar qué adaptador usar. Si omite este argumento, el control usará el primer adaptador de red que aparece en la lista del cuadro de diálogo Red de la opción Configuración del Panel de control.

Si utiliza el protocolo UDP, puede cambiar libremente las propiedades RemoteHost y RemotePort mientras permanezca conectado al mismo puerto local. No obstante, con el protocolo TCP deberá cerrar la conexión antes de cambiar las propiedades RemoteHost y RemotePort.



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.



Propiedades Winsock(control)

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

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

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

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

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]

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)

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

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.


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

Tipo de datos
Integer

Valores

Los valores de la propiedad State son:
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
 
 
 
Index (Propiedad, controles ActiveX)
Establece o devuelve el número que identifica inequívocamente un objeto de una colección.

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

El valor de la propiedad Index de un objeto puede cambiar cuando se ordenan de nuevo los objetos de la colección, como cuando establece la propiedad Sorted a True. Si espera que la propiedad Index cambie dinámicamente, puede que sea más útil hacer referencia a los objetos de una colección mediante la propiedad Key.


Name (Propiedad)

• Devuelve el nombre utilizado en el código para identificar un formulario, un control o un objeto de acceso a datos. Es de sólo lectura en tiempo de ejecución.

• Devuelve o establece el nombre de un objeto fuente.

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 usar la propiedad Name de un formulario con la instrucción Dim en tiempo de ejecución para crear otras instancias del formulario. No puede haber dos formularios con el mismo nombre en tiempo de diseño.

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.

Cambiar mayúsculas/minúsculas del valor de la propiedad Name para un Formulario u otro módulo sin cambiar el nombre puede producir un mensaje de error del tipo "Conflicto de nombres" la próxima vez que se cargue el proyecto que contiene el formulario o el módulo. Por ejemplo, cambiar "Form1" a "form1" producirá el error; cambiar "Form1" a "formX" no lo hará.

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.


Object (Propiedad, controles ActiveX)

Devuelve el objeto y un valor de un método o propiedad de un objeto.

Sintaxis
objeto_Object[.propiedad | .método]

La sintaxis de la propiedad Object consta de las siguientes partes:
Código:
Parte           Descripción
 
objeto          Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
propiedad       Propiedad compatible con el objeto.
método          Método compatible con el objeto.
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
 
La propiedad Parent es útil en una aplicación en la que se pasan objetos como argumentos. Por ejemplo, podría pasar una variable de control a un procedimiento general en un módulo y usar la propiedad Parent para tener acceso a su formulario primario.

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.


RemoteHost (Propiedad, controles ActiveX)

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 "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

La sintaxis de la propiedad RemoteHost consta de las siguientes partes:
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.

La propiedad RemoteHost también puede modificarse al invocar los métodos OpenURL o Execute.

En tiempo de ejecución, el cambio de este valor no tiene ningún efecto hasta la conexión siguiente.


RemotePort (Propiedad, controles ActiveX)
Devuelve o establece el número del puerto remoto con el que conectar.

Sintaxis
objeto.RemotePort = puerto

La sintaxis de la propiedad RemotePort consta de la siguientes partes:
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.
 
 
 
Tag (Propiedad, controles ActiveX)
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]

La sintaxis de la propiedad Tag consta de las siguientes partes:
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
 
   ' 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.)


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:
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.


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

Argumentos
Ninguno

Valor devuelto
Ninguno


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

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

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:
Código:
Parte     Descripción
objeto    Control Winsock
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.


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


Connect (Evento, control Winsock)

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

Sintaxis
objeto.Connect()

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:
Código:
Parte          Descripción
objeto        Control Winsock
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.

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.
Código:
Private Sub WinsockTCP_ConnectionRequest _
(requestID As Long)
   If Winsock1.State <> sckClosed Then Winsock1.Close
   Winsock.Accept IdSolicitud
End Sub
 
 
DataArrival (Evento)
 
Se produce cuando llegan nuevos datos.
 
Sintaxis
objeto_DataArrival (bytesTotales As Long)
La sintaxis del evento DataArrival consta de las siguientes partes:
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

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.
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
 
 
 
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:
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)
Se produce cuando termina una operación de envío.

Sintaxis
objeto_SendComplete

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:
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.
 

sortilego

Newbie Lvl 1
=======================================
EDIT JAJAJAJAJ arriba dice la fuente......como habre leido :p

Noposta me lo lei todo....y es exelente.....


RARO viniendo de microsoft que suele hacer cosas como "para buscar programas presione inicio"


xD


======================================

Disculpen el UP de este post viejo, pero merecia un comentario.



Exelente info Shura, si se sabe apreciar es MAS QUE EDUCATIVA :)


Esto lo "copypasteaste" de otro lado o lo escribiste vos?



Si lo escribiste todo vos desde tus conocimientos, la verdad, felicitaciones.


MUY MUY MUY BUENO, ya mismo me estoy bajando toda la info a mi PC por las dudas :)
 
A

Anonymous

Invitado
La verdad si merecía un comentario, pero de todos modos es revivir el tema y va contra el reglamento del foro, te recuerdo que es de lectura obligatoria y desconocer sus términos no es una excusa para evitar una sanción por parte de los administradores.

Suerte.
Tema cerrado.
 
Estado
Cerrado para nuevas respuestas.
Arriba