Broadcast mediante UDP
Enviar mensajes a toda una red utilizando Winsock

Fecha: 30/Abr/2005 (21/04/05)
Autor: Gustavo Alegre Hidalgo ([email protected]

 



Este ejemplo ilustra una manera muy fácil de crear una aplicación para enviar mensajes públicos a toda una red (similar al WinPopup de Win9X o al Mensajero de NT/2k/XP). El trabajo se realiza utilizando un control Winsock que apunta hacia la dirección IP 255.255.255.255 (dirección global o Broadcast) y a un puerto definido por el usuario.

Antes que nada explico un poco la función de UDP: El Protocolo de Datagramas de Usuario (o User Datagram Protocol) consiste en el envío de información de una PC a otra sin una conexión explícita (lo contrario al protocolo TCP que si requiere una conexión desde el cliente al servidor). Este protocolo es muy utilizado para recibir videos y música mediante el conocido streaming.

Al no requerir una conexión explícita, un programa UDP puede ser a la vez cliente como servidor (de ahí el origen a las aplicaciones de igual a igual o P2P), lo cual nos permite hacer programas tipo Chat LAN entre 2 o más computadoras con un mínimo esfuerzo.

Crear la aplicación:

Cada instancia de la aplicación utilizará un puerto (en nuestro ejemplo: 20145) para enviar y recibir mensajes. Si en otra PC también está abierto nuestro programa, podrá recibir el mensaje que hemos enviado y viceversa; igualmente en todas las computadoras de la red.

Primero crearemos un proyecto nuevo y le añadiremos el control Winsock desde el menú Proyecto - Componentes, luego diseñaremos un formulario similar a la figura:

Modelo del formulario para la aplicación
Modelo del formulario para la aplicación


Nombres de los controles:

wskBroadcast: El encargado del envío y recibo de mensajes.
txtMensaje: Contiene el mensaje que se desea enviar.
cmdEnviar: Al hacer clic en este botón, el mensaje se envía a toda la red.
txtDatosRecibidos: Todos los mensajes enviados desde otras PCs se mostrarán en esta caja de texto. Debe ser multilínea.

Y aquí está el código del programa:


Option Explicit

Private Sub cmdEnviar_Click()
On Error Resume Next 'Para ignorar error 126 en Win9X

'Es necesario establecer nuevamente el RemoteHost y
'el puerto, para asegurarse que los paquetes se lleguen
'a enviar a todos los destinatarios.
wskBroadcast.RemoteHost = "255.255.255.255"
wskBroadcast.RemotePort = 20145

wskBroadcast.SendData txtMensaje.Text 'Envía los datos

txtMensaje.Text = "" 'Limpia el txtMensaje
txtMensaje.SetFocus 'Mueve el foco hacia txtMensaje
End Sub

Private Sub Form_Load()
'Separamos el puerto 20145 para usarlo en nuestra
'aplicación.
wskBroadcast.Bind 20145
End Sub

Private Sub txtDatosRecibidos_Change()
'Mostrar siempre la última línea del TextBox.
txtDatosRecibidos.SelStart = Len(txtDatosRecibidos.Text)
End Sub

Private Sub txtMensaje_Change()
'Cuando el txtMensaje esté vacío, deshabilitar el botón
'de envío.
cmdEnviar.Enabled = (Len(txtMensaje.Text) > 0)
End Sub

Private Sub wskBroadcast_DataArrival(ByVal bytesTotal As Long)
Dim Datos As String 'Variable para guardar los datos

'Recibe los datos y los almacena en la variable
wskBroadcast.GetData Datos

'Si txtDatosRecibidos está vacío:
If Len(txtDatosRecibidos.Text) = 0 Then
txtDatosRecibidos.Text = wskBroadcast.RemoteHostIP & ">" & Datos
'de lo contrario insertar primero un salto de línea y
'luego los datos.
Else
txtDatosRecibidos.Text = txtDatosRecibidos.Text & vbCrLf & wskBroadcast.RemoteHostIP & ">" & Datos
End If
End Sub

Error 126 en Windows 9X (no aparece en NT y posteriores):

Por razones desconocidas (he buscado hasta cansarme y no pude encontrar nada importante), al enviar datos mediante UDP hacia una dirección de Broadcast, se produce un extraño error 126 sin descripción (se muestra en blanco) aunque los datos si se envían satisfactoriamente y dicho error se puede ignorar sin ningún inconveniente. Si alguien conoce el significado de esta excepción, por favor le agradecería comunicarse a mi correo.

 


ir al índice

Fichero con el código de ejemplo: galegre_BroadcastUDP.zip - Tamaño 2.54 KB