Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Класс 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");
}
}