Compartir a través de


Uso de servicios UDP

La UdpClient clase se comunica con los servicios de red mediante UDP. Las propiedades y los métodos de la clase UdpClient abstraen los detalles de la creación de un Socket para solicitar y recibir datos mediante UDP.

El Protocolo de datagramas de usuario (UDP) es un protocolo sencillo que hace un mejor esfuerzo para entregar datos a un host remoto. Sin embargo, dado que el protocolo UDP es un protocolo sin conexión, los datagramas UDP enviados al punto de conexión remoto no están garantizados para llegar, ni se garantiza que lleguen en la misma secuencia en la que se envían. Las aplicaciones que usan UDP deben estar preparadas para controlar los datagramas que faltan, duplicados y fuera de secuencia.

Para enviar un datagrama mediante UDP, debe conocer la dirección de red del dispositivo de red que hospeda el servicio que necesita y el número de puerto UDP que usa el servicio para comunicarse. La Autoridad de Números Asignados de Internet (IANA) define números de puerto para los servicios comunes (consulte Registro de Nombres de Servicios y Números de Puerto del Protocolo de Transporte). Los servicios que no están en la lista de IANA pueden tener números de puerto en el intervalo de 1024 a 65 535.

Las direcciones de red especiales se usan para admitir mensajes de difusión UDP en redes basadas en IP. En la siguiente explicación se usa la familia de direcciones IP versión 4 usada en Internet como ejemplo.

Las direcciones IP versión 4 usan 32 bits para especificar una dirección de red. Para las direcciones de clase C que usan una máscara de red de 255.255.255.0, estos bits se separan en cuatro octetos. Cuando se expresa en formato decimal, los cuatro octetos forman la conocida notación de cuatro dígitos separados por puntos, como 192.168.100.2. Los dos primeros octetos (192.168 en este ejemplo) forman el número de red, el tercer octeto (100) define la subred y el octeto final (2) es el identificador de host.

Al establecer todos los bits de una dirección IP en una o 255.255.255.255,255, se forma la dirección de difusión limitada. El envío de un datagrama UDP a esta dirección entrega el mensaje a cualquier host del segmento de red local. Dado que los enrutadores nunca reenvían los mensajes enviados a esta dirección, solo los hosts del segmento de red reciben el mensaje de broadcast.

Las difusiones se pueden dirigir a partes específicas de una red estableciendo todos los bits del identificador de anfitrión. Por ejemplo, para enviar una difusión a todos los hosts de la red identificados por direcciones IP a partir de 192.168.1, use la dirección 192.168.1.255.

El siguiente ejemplo de código usa un UdpClient para escuchar datagramas UDP en el puerto 11.000. El cliente recibe una cadena de mensaje y escribe el mensaje en la consola.

Imports System.Net
Imports System.Net.Sockets
Imports System.Text

Public Class UDPListener
   Private Const listenPort As Integer = 11000

   Private Shared Sub StartListener()
      Dim listener As New UdpClient(listenPort)
      Dim groupEP As New IPEndPoint(IPAddress.Any, listenPort)
      Try
         While True
            Console.WriteLine("Waiting for broadcast")
            Dim bytes As Byte() = listener.Receive(groupEP)
            Console.WriteLine("Received broadcast from {0} :", groupEP)
            Console.WriteLine(Encoding.ASCII.GetString(bytes, 0, bytes.Length))
         End While
      Catch e As SocketException
         Console.WriteLine(e)
      Finally
         listener.Close()
      End Try
   End Sub 'StartListener

   Public Shared Sub Main()
      StartListener()
   End Sub 'Main
End Class 'UDPListener
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

public class UDPListener
{
    private const int listenPort = 11000;

    private static void StartListener()
    {
        UdpClient listener = new UdpClient(listenPort);
        IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, listenPort);

        try
        {
            while (true)
            {
                Console.WriteLine("Waiting for broadcast");
                byte[] bytes = listener.Receive(ref groupEP);

                Console.WriteLine($"Received broadcast from {groupEP} :");
                Console.WriteLine($" {Encoding.ASCII.GetString(bytes, 0, bytes.Length)}");
            }
        }
        catch (SocketException e)
        {
            Console.WriteLine(e);
        }
        finally
        {
            listener.Close();
        }
    }

    public static void Main()
    {
        StartListener();
    }
}

En el ejemplo de código siguiente se usa un Socket para enviar datagramas UDP a la dirección de difusión dirigida 192.168.1.255, mediante el puerto 11 000. El cliente envía la cadena de mensaje especificada en la línea de comandos.

Imports System.Net
Imports System.Net.Sockets
Imports System.Text

Public Class Program
    Public Shared Sub Main(args() As [String])
      Dim s As New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
      s.EnableBroadcast = True
      Dim broadcast As IPAddress = IPAddress.Parse("192.168.1.255")
      Dim sendbuf As Byte() = Encoding.ASCII.GetBytes(args(0))
      Dim ep As New IPEndPoint(broadcast, 11000)
      s.SendTo(sendbuf, ep)
      Console.WriteLine("Message sent to the broadcast address")
   End Sub 'Main
End Class
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class Program
{
    static void Main(string[] args)
    {
        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        s.EnableBroadcast = true;

        IPAddress broadcast = IPAddress.Parse("192.168.1.255");

        byte[] sendbuf = Encoding.ASCII.GetBytes(args[0]);
        IPEndPoint ep = new IPEndPoint(broadcast, 11000);

        s.SendTo(sendbuf, ep);

        Console.WriteLine("Message sent to the broadcast address");
    }
}

Consulte también