Udostępnij za pośrednictwem


Korzystanie z usług UDP

Klasa UdpClient komunikuje się z usługami sieciowymi przy użyciu protokołu UDP. Właściwości i metody klasy UdpClient abstrahują szczegóły tworzenia obiektu Socket do żądania i odbierania danych przy użyciu protokołu UDP.

Protokół UDP (User Datagram Protocol) to prosty protokół, który najlepiej sprawdza się w celu dostarczania danych do hosta zdalnego. Jednak ze względu na to, że protokół UDP jest protokołem bez połączenia, datagramy UDP wysyłane do zdalnego punktu końcowego nie są gwarantowane do odebrania ani nie mają gwarancji przybycia do tej samej sekwencji, w której są wysyłane. Aplikacje korzystające z protokołu UDP muszą być przygotowane do obsługi brakujących, zduplikowanych i poza sekwencjonowanych datagramów.

Aby wysłać datagram przy użyciu protokołu UDP, musisz znać adres sieciowy urządzenia sieciowego obsługującego potrzebną usługę oraz numer portu UDP używany przez usługę do komunikacji. Urząd IANA (Internet Assigned Numbers Authority) definiuje numery portów dla typowych usług (zobacz Service Name and Transport Protocol Port Number Registry). Usługi, które nie znajdują się na liście IANA, mogą mieć numery portów z zakresu od 1024 do 65 535.

Specjalne adresy sieciowe są używane do obsługi komunikatów emisji UDP w sieciach opartych na adresach IP. W poniższej dyskusji użyto rodziny adresów IP w wersji 4 używanej w Internecie jako przykładu.

Adresy IP w wersji 4 używają 32 bitów do określenia adresu sieciowego. W przypadku adresów klasy C używających maski sieci 255.255.255.0 te bity są rozdzielone na cztery oktety. W przypadku wyrażenia w postaci dziesiętnej cztery oktety tworzą znaną notację czworokątową, taką jak 192.168.100.2. Pierwsze dwie oktety (192.168 w tym przykładzie) tworzą numer sieci, trzeci oktet (100) definiuje podsieć, a ostatni oktet (2) jest identyfikatorem hosta.

Ustawienie wszystkich bitów adresu IP na jeden lub 255.255.255.255.255 tworzy ograniczony adres emisji. Wysłanie datagramu UDP do tego adresu dostarcza komunikat do dowolnego hosta w segmencie sieci lokalnej. Ponieważ routery nigdy nie przesyłają dalej komunikatów wysyłanych do tego adresu, tylko hosty w segmencie sieci odbierają komunikat emisji.

Emisje mogą być kierowane do określonych części sieci, ustawiając wszystkie bity identyfikatora hosta. Na przykład, aby wysłać emisję do wszystkich hostów w sieci zidentyfikowanej przez adresy IP począwszy od 192.168.1, użyj adresu 192.168.1.255.

Poniższy przykład kodu używa UdpClient do nasłuchiwania datagramów UDP na porcie 11 000. Klient otrzymuje ciąg komunikatu i zapisuje komunikat w konsoli.

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

Poniższy przykład kodu używa obiektu do Socket wysyłania datagramów UDP do skierowanego adresu emisji 192.168.1.255 przy użyciu portu 11 000. Klient wysyła ciąg komunikatu określony w wierszu polecenia.

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

Zobacz też