Utilizar servicios UDP

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

UDP ofrece las ventajas de la sencillez y la posibilidad de difundir mensajes a varias direcciones al mismo tiempo. No obstante, como el protocolo UDP es un protocolo sin conexión, no se garantiza que los datagramas UDP enviados al extremo remoto lleguen, ni que lleguen en la misma secuencia en la que se envían. Las aplicaciones que utilizan UDP deben estar preparadas para controlar que no haya pérdida de datagramas y que lleguen en la secuencia correcta.

Para enviar un datagrama mediante un protocolo UDP, se debe conocer la dirección de red del dispositivo de red que aloja el servicio que se necesita y el número de puerto UDP que el servicio utiliza para la comunicación. Internet Assigned Numbers Authority (IANA) define los números de puerto para servicios comunes (vea www.iana.org/assignments/port-numbers). Los servicios no incluidos en la lista de IANA pueden tener números de puerto en el intervalo comprendido entre 1.024 y 65.535.

Las direcciones especiales de red se utilizan para admitir mensajes de difusión UDP en redes basadas en IP. La siguiente descripción utiliza la familia de direcciones IP versión 4 que se utiliza en Internet como ejemplo.

Las direcciones IP versión 4 utilizan 32 bits para especificar una dirección de red. En las direcciones de clase C que utilizan una máscara de red de 255.255.255.0, estos bits se separan en cuatro octetos. Cuando se expresan en forma decimal, los cuatro octetos forman la conocida notación de cuatro números separada 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 del host.

El establecimiento de todos los bits de una dirección IP en uno, o 255.255.255.255, da lugar a la dirección de difusión limitada. Al enviar un datagrama UDP a esa dirección se entrega el mensaje a cualquier host conectado en la misma subred local únicamente. Esto se debe a que los enrutadores nunca reenvían mensajes dirigidos a esta dirección.

Las difusiones se pueden dirigir a partes específicas de una red estableciendo el valor 255 en partes de la dirección. Por ejemplo, para enviar una difusión a todos los hosts de la red, identificados por direcciones IP que comienzan por 192.168, establezca el valor 255 en las partes de subred y host de la dirección, como en 192.168.255.255. Para limitar la difusión a una única subred, establezca el valor 255 sólo en la parte de host, como en 192.168.100.255.

La clase UdpClient puede difundir a cualquier dirección de la red, pero no puede escuchar las difusiones enviadas a la red. Se debe utilizar la clase Socket para escuchar las difusiones de red.

Las direcciones de difusión funcionan cuando todos los destinatarios están en una red única o cuando muchos clientes necesitan recibir la difusión. Cuando los destinatarios constituyen una parte pequeña de la red, el mensaje se debe enviar a un grupo multidifusión, en el que sólo los clientes que se han incorporado al grupo lo reciben. Las direcciones IP comprendidas entre 224.0.0.2 y 244.255.255.255 se reservan como direcciones de grupo de hosts. El número IP 224.0.0.0 está reservado, y el 224.0.0.1 se asigna al grupo permanente de todos los hosts IP.

En el siguiente ejemplo se utiliza UdpClient para escuchar la difusión de datagramas UDP al grupo de direcciones multidifusión 224.168.100.2 en el puerto 11000. Se recibe una cadena de mensaje y se escribe el mensaje en la consola.

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

Public Class UDPMulticastListener
    
    Private Shared GroupAddress As IPAddress = _
        IPAddress.Parse("224.168.100.2")
    Private Shared GroupPort As Integer = 11000 
    
    Private Shared Sub StartListener()
        Dim done As Boolean = False
        
        Dim listener As New UdpClient()
        Dim groupEP As New IPEndPoint(GroupAddress, GroupPort)
        
        Try
            listener.JoinMulticastGroup(GroupAddress)
            listener.Connect(groupEP)
            
            While Not done
                Console.WriteLine("Waiting for broadcast")
                Dim bytes As Byte() = listener.Receive(groupEP)
                
            Console.WriteLine("Received broadcast from {0} :" + _
                ControlChars.Cr + " {1}" + ControlChars.Cr, _
                groupEP.ToString(), _
                Encoding.ASCII.GetString(bytes, 0, bytes.Length))
            End While
            
            listener.Close()
        
        Catch e As Exception
            Console.WriteLine(e.ToString())
        End Try
    End Sub 'StartListener
    
    ' Entry point that delegates to C-style main Private Function.
    Public Overloads Shared Sub Main()
        System.Environment.ExitCode = _
            Main(System.Environment.GetCommandLineArgs())
    End Sub
    
    
    Overloads Public Shared Function Main(args() As [String]) As Integer
        StartListener()
        
        Return 0
    End Function 'Main
End Class 'UDPMulticastListener

[C#]
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

public class UDPMulticastListener {

    private static readonly IPAddress GroupAddress = 
       IPAddress.Parse("224.168.100.2");
    private const int GroupPort = 11000;
    
    private static void StartListener() {
        bool done = false;
        
        UdpClient listener = new UdpClient();
        IPEndPoint groupEP = new IPEndPoint(GroupAddress,GroupPort);

        try {
            listener.JoinMulticastGroup(GroupAddress);
            listener.Connect(groupEP);
            
            while (!done) {
                Console.WriteLine("Waiting for broadcast");
                byte[] bytes = listener.Receive( ref groupEP);

                Console.WriteLine("Received broadcast from {0} :\n {1}\n",
                    groupEP.ToString(),
                    Encoding.ASCII.GetString(bytes,0,bytes.Length));
            }

            listener.Close();
            
        } catch (Exception e) {
            Console.WriteLine(e.ToString());
        }
        
    }

    public static int Main(String[] args) {
        StartListener();

        return 0;
    }
}

En el siguiente ejemplo se usa UdpClient para enviar datagramas UDP al grupo de direcciones multidifusión 224.268.100.2, utilizando el puerto 11000. Se envía la cadena de mensaje especificada en la línea de comandos.

Imports System
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Public Class UDPMulticastSender
    
    Private Shared GroupAddress As IPAddress = _
        IPAddress.Parse("224.168.100.2")
    Private Shared GroupPort As Integer = 11000
    
    
    Private Shared Sub Send(message As [String])
        Dim sender As New UdpClient()
        Dim groupEP As New IPEndPoint(GroupAddress, GroupPort)
        
        Try
            Console.WriteLine("Sending datagram : {0}", message)
            Dim bytes As Byte() = Encoding.ASCII.GetBytes(message)
            
            sender.Send(bytes, bytes.Length, groupEP)
            
            sender.Close()
        
        Catch e As Exception
            Console.WriteLine(e.ToString())
        End Try
    End Sub 'Send
    
    ' Entry point  that delegates to C-style main Private Function.
    Public Overloads Shared Sub Main()
        System.Environment.ExitCode = _
           Main(System.Environment.GetCommandLineArgs())
    End Sub
    
    
    Overloads Public Shared Function Main(args() As [String]) As Integer
        Send(args(0))
        
        Return 0
    End Function 'Main
End Class 'UDPMulticastSender
[C#]
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

public class UDPMulticastSender {

    private static IPAddress GroupAddress = 
        IPAddress.Parse("224.168.100.2");
    private static int GroupPort = 11000;
    
    private static void Send( String message) {
        UdpClient sender = new UdpClient();
        IPEndPoint groupEP = new IPEndPoint(GroupAddress,GroupPort);

        try {
            Console.WriteLine("Sending datagram : {0}", message);
            byte[] bytes = Encoding.ASCII.GetBytes(message);

            sender.Send(bytes, bytes.Length, groupEP);
            
            sender.Close();
            
        } catch (Exception e) {
            Console.WriteLine(e.ToString());
        }
        
    }

    public static int Main(String[] args) {
        Send(args[0]);

        return 0;
    }
}

Vea también

TCP/UDP