Partilhar via


Usar serviços UDP

A UdpClient classe se comunica com serviços de rede usando UDP. As propriedades e métodos UdpClient da classe abstraem os detalhes da criação de um Socket para solicitar e receber dados usando UDP.

O UDP (User Datagram Protocol) é um protocolo simples que faz o melhor esforço para entregar dados a um host remoto. No entanto, como o protocolo UDP é um protocolo sem conexão, não é garantido que os datagramas UDP enviados para o ponto de extremidade remoto cheguem, nem que cheguem na mesma sequência em que são enviados. Os aplicativos que usam UDP devem estar preparados para lidar com datagramas ausentes, duplicados e fora de sequência.

Para enviar um datagrama usando UDP, você deve saber o endereço de rede do dispositivo de rede que hospeda o serviço necessário e o número da porta UDP que o serviço usa para se comunicar. A Internet Assigned Numbers Authority (IANA) define números de porta para serviços comuns (consulte Nome do Serviço e Registro do Número de Porta do Protocolo de Transporte). Os serviços que não estão na lista IANA podem ter números de porta no intervalo de 1.024 a 65.535.

Endereços de rede especiais são usados para suportar mensagens de difusão UDP em redes baseadas em IP. A discussão a seguir usa a família de endereços IP versão 4 usada na Internet como exemplo.

Os endereços IP versão 4 usam 32 bits para especificar um endereço de rede. Para endereços de classe C usando uma máscara de rede de 255.255.255.0, esses bits são separados em quatro octetos. Quando expressos em decimais, os quatro octetos formam a conhecida notação pontilhada-quádrupla, como 192.168.100.2. Os dois primeiros octetos (192.168 neste exemplo) formam o número da rede, o terceiro octeto (100) define a sub-rede e o octeto final (2) é o identificador do host.

Definir todos os bits de um endereço IP para um, ou 255.255.255.255, forma o endereço de difusão limitado. O envio de um datagrama UDP para esse endereço entrega a mensagem a qualquer host no segmento de rede local. Como os roteadores nunca encaminham mensagens enviadas para esse endereço, apenas os hosts no segmento de rede recebem a mensagem de transmissão.

As transmissões podem ser direcionadas para partes específicas de uma rede definindo todos os bits do identificador do host. Por exemplo, para enviar uma transmissão para todos os hosts na rede identificados por endereços IP a partir de 192.168.1, use o endereço 192.168.1.255.

O exemplo de código a seguir usa um UdpClient para escutar datagramas UDP na porta 11.000. O cliente recebe uma cadeia de caracteres de mensagem e grava a mensagem no console.

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();
    }
}

O exemplo de código a seguir usa um Socket para enviar datagramas UDP para o endereço de difusão direcionado 192.168.1.255, usando a porta 11.000. O cliente envia a cadeia de caracteres de mensagem especificada na linha de comando.

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");
    }
}

Ver também