Freigeben über


Verwenden von UDP-Diensten

Die UdpClient Klasse kommuniziert mit Netzwerkdiensten mithilfe von UDP. Die Eigenschaften und Methoden der Klasse UdpClient abstrahieren die Details beim Erstellen eines Socket zum Anfordern und Empfangen von Daten mithilfe von UDP.

Das User Datagram Protocol (UDP) ist ein einfaches Protokoll, das sich bemüht, Daten an einen Remote-Host zu liefern. Da das UDP-Protokoll jedoch ein verbindungsloses Protokoll ist, wird nicht garantiert, dass UDP-Datagramme, die an den Remoteendpunkt gesendet werden, eintreffen oder in der gleichen Reihenfolge ankommen, in der sie gesendet wurden. Anwendungen, die UDP verwenden, müssen darauf vorbereitet sein, fehlende, doppelte und außerhalb der Reihenfolge liegende Datagramme zu verarbeiten.

Um ein Datagramm mit UDP zu senden, müssen Sie die Netzwerkadresse des Netzwerkgeräts kennen, das den benötigten Dienst hosten, und die UDP-Portnummer, die der Dienst für die Kommunikation verwendet. Die Internet Assigned Numbers Authority (IANA) definiert Portnummern für allgemeine Dienste (siehe Service Name and Transport Protocol Port Number Registry). Dienste, die nicht in der IANA-Liste enthalten sind, können Portnummern im Bereich von 1.024 bis 65.535 aufweisen.

Spezielle Netzwerkadressen werden verwendet, um UDP-Übertragungsnachrichten in IP-basierten Netzwerken zu unterstützen. In der folgenden Diskussion wird die ip Version 4-Adressfamilie verwendet, die im Internet als Beispiel verwendet wird.

IP-Version 4-Adressen verwenden 32 Bit, um eine Netzwerkadresse anzugeben. Bei Klasse-C-Adressen mit einer Netzmaske von 255.255.255.0 werden diese Bits in vier Oktette aufgeteilt. Wenn sie in dezimal ausgedrückt wird, bilden die vier Oktette die vertraute punktierte Vierecknotation, z. B. 192.168.100.2. Die ersten beiden Oktette (192.168 in diesem Beispiel) bilden die Netzwerknummer, das dritte Oktett (100) definiert das Subnetz, und das letzte Oktett (2) ist der Hostbezeichner.

Das Festlegen aller Bits einer IP-Adresse auf eine oder 255.255.255.255 bildet die eingeschränkte Übertragungsadresse. Das Senden eines UDP-Datagramms an diese Adresse liefert die Nachricht an einen beliebigen Host im lokalen Netzwerksegment. Da Router niemals Nachrichten weiterleiten, die an diese Adresse gesendet werden, empfangen nur Hosts im Netzwerksegment die Übertragungsnachricht.

Übertragungen können an bestimmte Teile eines Netzwerks weitergeleitet werden, indem alle Bits des Hostbezeichners festgelegt werden. Wenn Sie beispielsweise eine Übertragung an alle Hosts im Netzwerk senden möchten, die von IP-Adressen ab 192.168.1 identifiziert werden, verwenden Sie die Adresse 192.168.1.255.

In dem folgenden Codebeispiel wird ein UdpClient verwendet, um UDP-Datagramme auf Port 11.000 abzuhören. Der Client empfängt eine Nachrichtenzeichenfolge und schreibt die Nachricht in die Konsole.

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

Im folgenden Codebeispiel wird ein Socket verwendet, um UDP-Datagramme an die zielgerichtete Broadcast-Adresse 192.168.1.255 und über Port 11000 zu senden. Der Client sendet die in der Befehlszeile angegebene Nachrichtenzeichenfolge.

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

Siehe auch