Dela via


Använda UDP-tjänster

Klassen UdpClient kommunicerar med nätverkstjänster med UDP. Egenskaperna och metoderna för UdpClient klassen sammanfattar informationen om hur du skapar en Socket för att begära och ta emot data med UDP.

User Datagram Protocol (UDP) är ett enkelt protokoll som gör det bästa för att leverera data till en fjärrvärd. Men eftersom UDP-protokollet är ett anslutningslöst protokoll är UDP-datagram som skickas till fjärrslutpunkten inte garanterade att de tas emot, och de garanteras inte heller att de kommer i samma sekvens som de skickas i. Program som använder UDP måste förberedas för att hantera saknade datagram, dubbletter och out-of-sequence-datagram.

Om du vill skicka ett datagram med UDP måste du känna till nätverksadressen för den nätverksenhet som är värd för den tjänst du behöver och det UDP-portnummer som tjänsten använder för att kommunicera. IANA (Internet Assigned Numbers Authority) definierar portnummer för vanliga tjänster (se Portnummerregister för tjänstnamn och transportprotokoll). Tjänster som inte finns i IANA-listan kan ha portnummer i intervallet 1 024 till 65 535.

Särskilda nätverksadresser används för att stödja UDP-sändningsmeddelanden i IP-baserade nätverk. I följande diskussion används ip-adressfamiljen version 4 som används på Internet som exempel.

IP-version 4-adresser använder 32 bitar för att ange en nätverksadress. För klass C-adresser med en nätmask på 255.255.255.0 är dessa bitar uppdelade i fyra oktetter. När de uttrycks i decimalform bildar de fyra oktetterna den välbekanta streckade quad-notationen, till exempel 192.168.100.2. De två första oktetterna (192.168 i det här exemplet) utgör nätverksnumret, den tredje oktetten (100) definierar undernätet och den sista oktetten (2) är värdidentifieraren.

Att ange alla bitar av en IP-adress till en, eller 255.255.255.255, utgör den begränsade sändningsadressen. När du skickar ett UDP-datagram till den här adressen skickas meddelandet till valfri värd i det lokala nätverkssegmentet. Eftersom routrar aldrig vidarebefordrar meddelanden som skickas till den här adressen får bara värdar i nätverkssegmentet sändningsmeddelandet.

Sändningar kan dirigeras till specifika delar av ett nätverk genom att ange alla bitar av värdidentifieraren. Om du till exempel vill skicka en sändning till alla värdar i nätverket som identifieras av IP-adresser från och med 192.168.1 använder du adressen 192.168.1.255.

I följande kodexempel används en UdpClient för att lyssna efter UDP-datagram på port 11 000. Klienten tar emot en meddelandesträng och skriver meddelandet till konsolen.

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

I följande kodexempel används en Socket för att skicka UDP-datagram till den dirigerade sändningsadressen 192.168.1.255 med port 11 000. Klienten skickar meddelandesträngen som anges på kommandoraden.

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

Se även