Поделиться через


Использование служб UDP

Класс UdpClient взаимодействует с сетевыми службами с помощью UDP. Класса UdpClient свойства и методы абстрагируют детали создания запроса Socket и получения данных с помощью UDP.

Протокол пользовательской диаграммы данных (UDP) — это простой протокол, который делает все возможное для доставки данных удаленному узлу. Тем не менее, поскольку протокол UDP является протоколом без подключения, UDP-диаграммы данных, отправленные в удаленную конечную точку, не гарантируются прибыть в той же последовательности, в которой они отправляются. Приложения, использующие UDP, должны быть готовы к обработке отсутствующих, повторяющихся и устаревших диаграмм данных.

Чтобы отправить диаграмму данных с помощью UDP, необходимо знать сетевой адрес сетевого устройства, на котором размещена служба, и номер порта UDP, используемый службой для обмена данными. Центр назначения номеров Интернета (IANA) определяет номера портов для общих служб (см. раздел "Имя службы" и реестр номеров портов транспорта). Службы, не имеющиеся в списке IANA, могут иметь номера портов в диапазоне от 1024 до 65 535.

Специальные сетевые адреса используются для поддержки широковещательных сообщений UDP в ip-сетях. В следующем обсуждении используется семейство адресов IP версии 4, используемое в Интернете в качестве примера.

IP-адрес версии 4 использует 32 бита для указания сетевого адреса. Для адресов класса C с использованием netmask 255.255.255.0 эти биты разделены на четыре октета. При выражении в десятичном формате четыре октета образуют знакомую нотацию dotted-quad, например 192.168.100.2. Первые два октета (192.168 в этом примере) образуют номер сети, третий октет (100) определяет подсеть, а последний октет (2) — идентификатор узла.

При установке всех битов IP-адреса на один или 255.255.255.255 формируется ограниченный широковещательный адрес. Отправка диаграммы данных UDP в этот адрес передает сообщение любому узлу в сегменте локальной сети. Поскольку маршрутизаторы никогда не пересылают сообщения, отправленные на этот адрес, только узлы данного сетевого сегмента получают широковещательное сообщение.

Широковещательные передачи можно направлять в определенные части сети, задав все биты идентификатора хоста. Например, чтобы отправить трансляцию всем узлам в сети, определяемой IP-адресами, начиная с 192.168.1, используйте адрес 192.168.1.255.

В следующем примере кода используется UdpClient для прослушивания датаграмм UDP на порту 11 000. Клиент получает строку сообщения и записывает сообщение в консоль.

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

В следующем примере кода используется Socket для отправки UDP-диаграмм данных на адрес направленной трансляции 192.168.1.255 с помощью порта 11 000. Клиент отправляет строку сообщения, указанную в командной строке.

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

См. также