Dim SocketMensajes As New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
Dim Hilo As Thread
Dim Saliendo As Boolean = False
Dim DireccIP As String, ContenidoMensaje As String
form_load
'Separamos el puerto 200145 para usarlo en nuestra aplicación
SocketMensajes.Bind(New IPEndPoint(IPAddress.Any, 21145))
'SocketComunicacion.Bind(New IPEndPoint(System.Net.IPAddress.Any, 20145))
'Habilitamos la opción Broadcast para el socket
SocketMensajes.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1)
Hilo = New Thread(AddressOf RecibirDatos) 'Crea el hilo
Hilo.Start() 'Inicia el hilo
Private Sub txtMensaje_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtMensaje.KeyUp
Try
If e.KeyCode = Keys.Enter Then
If lstContactos.SelectedIndex >= 0 Then
Dim Destino As New IPEndPoint(IPAddress.Parse(lstIP.Items.Item(lstContactos.SelectedIndex).ToString), 21145)
'Buffer que guardará los datos hasta que se envíen
Dim DatosBytes As Byte() = Encoding.Default.GetBytes(Usuario & ":" & txtMensaje.Text)
'Envía los datos
SocketMensajes.SendTo(DatosBytes, DatosBytes.Length, SocketFlags.None, Destino)
txtConversacion.Text = Usuario + ":" + vbCrLf + txtMensaje.Text + vbCrLf + vbCrLf + txtConversacion.Text
txtMensaje.Text = ""
Else
MsgBox("Seleccione un usuario a quien enviar el mensaje", MsgBoxStyle.Information, "CHAT\Envio de Mensajes")
End If
End If
Catch ex As Exception
MsgBox("Error: " & ex.Message, MsgBoxStyle.Critical, "CHAT\Error al enviar mensaje")
End Try
End Sub
Private Sub RecibirDatos()
'Mientras el inidicador de salida no sea verdadero
Do Until Saliendo
'Variable para obtener la IP de la máquína remitente
Dim IPRemota As New IPEndPoint(IPAddress.Any, 0)
Dim Remitente, Mensaje As String
Dim i, x As Long
'Variable para almacenar la IP temporalmente
Dim IPRecibida As EndPoint = CType(IPRemota, EndPoint)
Dim RecibirBytes(255) As Byte 'Buffer
Dim Datos As String = "" 'Texto a mostrar
Try
'Recibe los datos
SocketMensajes.ReceiveFrom(RecibirBytes, RecibirBytes.Length, SocketFlags.None, IPRecibida)
'Los convierte y lo guarda en la variable Datos
Datos = Encoding.Default.GetString(RecibirBytes)
Catch ex As SocketException
If ex.ErrorCode = 10040 Then 'Datos muy largos
Datos &= "[truncado]" 'Añade la cadena "[truncado]" al texto recibido
Else
'Muestra el mensaje de error
MsgBox("Error '" & ex.ErrorCode.ToString & "' " & ex.Message, MsgBoxStyle.Critical, "Error al recibir datos")
End If
End Try
'Convierte el tipo EndPoint a IPEndPoint con sus respectivas variables
IPRemota = CType(IPRecibida, IPEndPoint)
'Guarda los datos en variables temporales
DireccIP = IPRemota.Address.ToString
ContenidoMensaje = Datos.ToString
For i = 1 To Len(ContenidoMensaje)
If Mid(ContenidoMensaje, i, 1) = ":" Then
x = i
End If
Next
Remitente = ContenidoMensaje.Substring(0, x - 1)
Mensaje = ContenidoMensaje.Substring(x)
txtConversacion.Text += vbCrLf + vbCrLf + Remitente + ":" + vbCrLf + Mensaje
txtConversacion.ScrollToCaret()
Loop
End Sub
End Class