Megosztás a következőn keresztül:


UDP-szolgáltatások használata

Az UdpClient osztály UDP használatával kommunikál a hálózati szolgáltatásokkal. Az UdpClient osztály tulajdonságai és metódusai elvonatkoztatják az UDP használatával történő adatkérés és -fogadás részleteit, amelyek a Socket létrehozásához szükségesek.

A User Datagram Protocol (UDP) egy egyszerű protokoll, amely mindent megtesz annak érdekében, hogy adatokat továbbítson egy távoli gazdagépnek. Mivel azonban az UDP protokoll kapcsolat nélküli protokoll, a távoli végpontra küldött UDP-adatgramok nem garantáltan érkeznek meg, és nem is garantáltan ugyanabba a sorrendbe érkeznek, amelyben a rendszer elküldi őket. Az UDP-t használó alkalmazásokat fel kell készíteni a hiányzó, duplikált és sorozaton kívüli adatgramok kezelésére.

A datagram UDP használatával történő küldéséhez ismernie kell a szükséges szolgáltatást üzemeltető hálózati eszköz hálózati címét és a szolgáltatás által a kommunikációhoz használt UDP-portszámot. Az Internet Assigned Numbers Authority (IANA) a gyakori szolgáltatások portszámait határozza meg (lásd : Szolgáltatásnév és Átviteli protokoll portszámjegyzéke). Az IANA-listán nem szereplő szolgáltatások portszáma 1 024 és 65 535 között lehet.

A speciális hálózati címek az IP-alapú hálózatok UDP-közvetítési üzeneteinek támogatására szolgálnak. Az alábbi vitafórum az interneten használt 4-es verziójú IP-címcsaládot használja példaként.

A 4-es verziójú IP-címek 32 bitet használnak a hálózati cím megadásához. A 255.255.255.0-s netmaszkot használó C osztálycímek esetében ezek a bitek négy oktettből állnak. Decimálisan kifejezve a négy oktett a jól ismert pontozott-negyed jelölést alkotja, például 192.168.100.2. Az első két oktett (ebben a példában 192.168) alkotja a hálózati számot, a harmadik oktett (100) határozza meg az alhálózatot, az utolsó oktett (2) pedig a gazdagép azonosítója.

Az IP-cím összes bitjének egy vagy 255.255.255.255-ös értékre állítása a korlátozott szórási címet adja meg. Ha UDP-adatgramot küld erre a címre, az üzenetet a helyi hálózati szegmens bármely gazdagépének kézbesíti. Mivel az útválasztók soha nem továbbítják az erre a címre küldött üzeneteket, csak a hálózati szegmensben lévő gazdagépek kapják meg a közvetítési üzenetet.

A közvetítések a hálózat adott részeire irányíthatók a gazdagépazonosító összes bitjének beállításával. Ha például a 192.168.1-től kezdődő IP-címek által azonosított összes kiszolgálónak szeretne közvetítést küldeni, használja a 192.168.1.255-ös címet.

Az alábbi példakód az UdpClient UDP-adatgramok figyelésére szolgál a 11 000-s porton. Az ügyfél kap egy üzenetsztringet, és megírja az üzenetet a konzolra.

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

Az alábbi kódpélda a Socket használatával UDP-adatgramokat küld a 192.168.1.255-ös irányított szórási címre a 11 000-es porton. Az ügyfél elküldi a parancssorban megadott üzenetsztringet.

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

Lásd még