none
Recepcion de datos con Ethernet (UDP) RRS feed

  • Pregunta

  • Hola! he estado trabajando con la recepción de datos con un socket UDP (como lo comente en otra pregunta), gracias a su ayuda he visto como realizar esto con BeginReceive, el problema es que no entiendo por completo como utilizar este metodo y mis intentos no han dado buenos resultados,.. agradecería muchisimo un ejemplo o un poco mas de orientacion al respecto, ya que apenas me inicio en  este tema...Gracias!!!  
    martes, 21 de junio de 2016 19:44

Respuestas

  • Hola, te dejo un ejemplo del envío y recepción de datos por UDP:

    Vamos a definir unas variables públicas y agregar un ListView al formulario para obtener los datos

    'Variables locales

    Public Socket As New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
     Public HiloEscucha As Thread
     Public DatoUDP As String = ""

    public sub ReciboDatos() Try Dim IPRemota As New IPEndPoint(IPAddress.Any, 0) Dim IPLocal As EndPoint = CType(IPRemota, EndPoint) Dim RecibirByte(1500) As Byte Dim DatoRecibido As String = "" Do Until Saliendo Socket.ReceiveFrom(RecibirByte, 0, 1500, SocketFlags.None, IPLocal) DatoRecibido = Encoding.Default.GetString(RecibirByte) DatoUDP = DatoRecibido

    'Aquí agregamos al listview el dato recibido ListView1.Items.Add(DatoRecibido) For i As Integer = 0 To 1500 RecibirByte(i) = Nothing Next Loop Catch ex As Exception End Try End Sub

    Luego creamos el hilo y definimos el socket (Puedes crearlo en el load)

    Try
      Socket.Bind(New IPEndPoint(IPAddress.Any, "2715"))
    				HiloEscucha = New     Thread(AddressOf ReciboDatos)
      HiloEscucha.Start()
    Catch ex As Exception
    
    End Try

    El puerto de escucha va a ser el 2715 y para terminar podrías poner un timer que verifique la lista si tiene datos recibidos, obtienes el dato y borras o haces lo que necesites hacer.

    Ahora vamos a crear un método para enviar datos (obviamente por UDP)

    'Se crea el socket que enviará los datos

    Public Socket1 As New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp) public sub EnviarDatosUDP(Byval Datos as String) Try Dim IP_Host As String = "192.168.25.21" Dim DireccionPuertoRemoto As New IPEndPoint(IPAddress.Parse(IP_Host), "2715") Dim DatosBytes As Byte() = Encoding.Default.GetBytes(Datos) Socket1.SendTo(DatosBytes, DatosBytes.Length, SocketFlags.None, DireccionPuertoRemoto) Catch ex As Exception MsgBox(ex.Message.ToString, MsgBoxStyle.Exclamation, "ENVIO DE DATOS UDP") End Try End Sub


    Como puede ver, este método es más sencillo, tiene un párametro que son los datos a enviar y listo

    Prueba a ver como te va



    Javier

    • Marcado como respuesta Mitzuko -.- jueves, 23 de junio de 2016 19:30
    miércoles, 22 de junio de 2016 2:25
  • Quita del método ReciboDatos el listview y con un timer sólo verifica que la variable DatoUDP sea diferente de "", de todas maneras te dejó la solución. UDP

    Saludos


    Javier

    • Propuesto como respuesta Javier Córdova jueves, 23 de junio de 2016 14:35
    • Marcado como respuesta Mitzuko -.- jueves, 23 de junio de 2016 19:28
    jueves, 23 de junio de 2016 14:35

Todas las respuestas

  • Hola, te dejo un ejemplo del envío y recepción de datos por UDP:

    Vamos a definir unas variables públicas y agregar un ListView al formulario para obtener los datos

    'Variables locales

    Public Socket As New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
     Public HiloEscucha As Thread
     Public DatoUDP As String = ""

    public sub ReciboDatos() Try Dim IPRemota As New IPEndPoint(IPAddress.Any, 0) Dim IPLocal As EndPoint = CType(IPRemota, EndPoint) Dim RecibirByte(1500) As Byte Dim DatoRecibido As String = "" Do Until Saliendo Socket.ReceiveFrom(RecibirByte, 0, 1500, SocketFlags.None, IPLocal) DatoRecibido = Encoding.Default.GetString(RecibirByte) DatoUDP = DatoRecibido

    'Aquí agregamos al listview el dato recibido ListView1.Items.Add(DatoRecibido) For i As Integer = 0 To 1500 RecibirByte(i) = Nothing Next Loop Catch ex As Exception End Try End Sub

    Luego creamos el hilo y definimos el socket (Puedes crearlo en el load)

    Try
      Socket.Bind(New IPEndPoint(IPAddress.Any, "2715"))
    				HiloEscucha = New     Thread(AddressOf ReciboDatos)
      HiloEscucha.Start()
    Catch ex As Exception
    
    End Try

    El puerto de escucha va a ser el 2715 y para terminar podrías poner un timer que verifique la lista si tiene datos recibidos, obtienes el dato y borras o haces lo que necesites hacer.

    Ahora vamos a crear un método para enviar datos (obviamente por UDP)

    'Se crea el socket que enviará los datos

    Public Socket1 As New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp) public sub EnviarDatosUDP(Byval Datos as String) Try Dim IP_Host As String = "192.168.25.21" Dim DireccionPuertoRemoto As New IPEndPoint(IPAddress.Parse(IP_Host), "2715") Dim DatosBytes As Byte() = Encoding.Default.GetBytes(Datos) Socket1.SendTo(DatosBytes, DatosBytes.Length, SocketFlags.None, DireccionPuertoRemoto) Catch ex As Exception MsgBox(ex.Message.ToString, MsgBoxStyle.Exclamation, "ENVIO DE DATOS UDP") End Try End Sub


    Como puede ver, este método es más sencillo, tiene un párametro que son los datos a enviar y listo

    Prueba a ver como te va



    Javier

    • Marcado como respuesta Mitzuko -.- jueves, 23 de junio de 2016 19:30
    miércoles, 22 de junio de 2016 2:25
  • Hola!, muchass gracias!..he estado probando, importe lo necesario pero no logro que funcione,..me marca un error en "Saliendo " no se como corregirlo. 

    miércoles, 22 de junio de 2016 17:44
  • Que error te marca? y en donde pusiste el método ReciboDatos() ?


    Javier

    miércoles, 22 de junio de 2016 17:52
  • dice que no esta declarado o inaccesible...y lo puse dentro dela clase del form
    miércoles, 22 de junio de 2016 19:27
  • y lo unico que he cambiado es el puerto y la direccion ip
    miércoles, 22 de junio de 2016 19:32
  • Te cuento que acabo de probar y el método no da ningún error, en que versión de vs estás trabajando para ver si te envío un proyecto


    Javier

    miércoles, 22 de junio de 2016 19:54
  • oralee...es en el 2013
    miércoles, 22 de junio de 2016 19:56
  • Antes de eso prueba agregando una variable global Saliendo de tipo boolean con valor falso, por eso sale que no esta declarado o es inaccesible. Perdón me falto eso.
    Public Saliendo as Boolean = false

     

    Javier

    miércoles, 22 de junio de 2016 20:24
  • Aaaa gracias, ahorita lo agrego!
    miércoles, 22 de junio de 2016 20:56
  • ya lo he agregado pero no me queda...en teoría entiendo como esta funcionando pero no lo logro que reciba los datos :(
    jueves, 23 de junio de 2016 6:49
  • si "Saliendo" se esta inicializando como "Falsa", con que condición cambiara de estado??
    jueves, 23 de junio de 2016 6:50
  • Quita del método ReciboDatos el listview y con un timer sólo verifica que la variable DatoUDP sea diferente de "", de todas maneras te dejó la solución. UDP

    Saludos


    Javier

    • Propuesto como respuesta Javier Córdova jueves, 23 de junio de 2016 14:35
    • Marcado como respuesta Mitzuko -.- jueves, 23 de junio de 2016 19:28
    jueves, 23 de junio de 2016 14:35
  • Hola! ya esta funcionando perfectamente!! Muchass Gracias!!!!...solo que requiero mostrar los datos sin Timer, porque al usarlo pierdo muchos de estos y no debe haber perdidas...es posible que se pueda trabajar con los datos sin Timer?

    Mitzuko -.-

    jueves, 23 de junio de 2016 20:12
  • El timer lo agregue para que puedas validar cuando la variable DatosUDP esta llena, mientras este vacía significa que no ha llegado ningún dato, para validar que no haya pérdida de datos, deberías hacer una especie de checksum que resplade el envío y la recpeción de los datos.

    lo más simple sería que en el proyecto de envío también escuches y en el servidor también envíe datos, aunque para eso sería más recomendable trabajar con sockets TCP/IP.

    Saludos


    Javier

    jueves, 23 de junio de 2016 20:19
  • voy a ver como hacerle..lo que pasa que el controlador que me envía los datos solo admite protocolo UDP 

    Mitzuko -.-

    lunes, 27 de junio de 2016 14:34