Delen via


UDP-services gebruiken

De UdpClient klasse communiceert met netwerkservices met behulp van UDP. De eigenschappen en methoden van de UdpClient klasse abstraheren de details van het maken van een Socket voor het aanvragen en ontvangen van gegevens met behulp van UDP.

User Datagram Protocol (UDP) is een eenvoudig protocol dat het best doet om gegevens te leveren aan een externe host. Omdat het UDP-protocol echter een verbindingsloos protocol is, zijn UDP-gegevensgrammen die naar het externe eindpunt worden verzonden, niet gegarandeerd binnen te komen, evenmin zijn ze gegarandeerd in dezelfde volgorde waarin ze worden verzonden. Toepassingen die gebruikmaken van UDP moeten worden voorbereid op het verwerken van ontbrekende, dubbele en out-of-sequence gegevensgrammen.

Als u een datagram wilt verzenden met behulp van UDP, moet u het netwerkadres weten van het netwerkapparaat dat als host fungeert voor de service die u nodig hebt en het UDP-poortnummer dat de service gebruikt om te communiceren. De Internet Assigned Numbers Authority (IANA) definieert poortnummers voor algemene services (zie register van servicenaam en transportprotocolpoortnummer). Services die niet op de IANA-lijst staan, kunnen poortnummers hebben in het bereik van 1024 tot 65.535.

Speciale netwerkadressen worden gebruikt ter ondersteuning van UDP-broadcastberichten op IP-netwerken. In de volgende discussie wordt de IP-adresfamilie van versie 4 gebruikt die op internet wordt gebruikt als voorbeeld.

IP-versie 4-adressen gebruiken 32 bits om een netwerkadres op te geven. Voor klasse C-adressen die een netmasker van 255.255.255.0 gebruiken, worden deze bits gescheiden in vier octetten. Wanneer ze worden uitgedrukt in decimalen, vormen de vier octetten de bekende gestippelde-quad-notatie, zoals 192.168.100.2. De eerste twee octetten (192.168 in dit voorbeeld) vormen het netwerknummer, het derde octet (100) definieert het subnet en de laatste octet (2) is de host-id.

Als u alle bits van een IP-adres instelt op één of 255.255.255.255, vormt dit het beperkte broadcast-adres. Als u een UDP-datagram naar dit adres verzendt, wordt het bericht bezorgd bij elke host in het lokale netwerksegment. Omdat routers nooit berichten die naar dit adres worden gestuurd doorzenden, ontvangen alleen hosts op het netwerksegment het broadcastbericht.

Broadcasts kunnen worden omgeleid naar specifieke delen van een netwerk door alle bits van de host-id in te stellen. Gebruik bijvoorbeeld het adres 192.168.1.255 om een uitzending te verzenden naar alle hosts in het netwerk die beginnen met 192.168.1.255.

In het volgende codevoorbeeld wordt gebruikgemaakt van een UdpClient om te luisteren naar UDP-gegevensgrammen op poort 11.000. De client ontvangt een berichttekenreeks en schrijft het bericht naar de 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();
    }
}

In het volgende codevoorbeeld worden UDP-gegevensgrammen verzonden naar het specifieke broadcastadres 192.168.1.255, via poort 11.000. De client verzendt de berichtreeks die is opgegeven op de opdrachtregel.

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

Zie ook