Прием UDP-пакета в C#
Приемник UDP ждет одну датаграмму.
Вызов ReceiveAsync возвращает ее целиком:
байты лежат в свойстве Buffer, строку
собирают из этого массива. Приемник поднимают
в Task.Run и только после привязки порта
отправляют пакет, иначе ждать пришлось бы вечно.
Приемник на порту 18081 печатает текст
пакета. Основной поток отправляет короткое
сообщение на 127.0.0.1:
using System.Net;
using System.Net.Sockets;
using System.Text;
TaskCompletionSource ready = new();
Task listener = Task.Run(async () =>
{
using UdpClient server = new(18081);
ready.SetResult();
UdpReceiveResult packet = await server.ReceiveAsync();
Console.WriteLine(Encoding.UTF8.GetString(packet.Buffer)); // выведет "probe"
});
await ready.Task;
using UdpClient client = new();
await client.SendAsync(Encoding.UTF8.GetBytes("probe"), "127.0.0.1", 18081);
await listener;
Число байтов в принятой датаграмме - это длина
массива Buffer. Тот же каркас печатает
длину более длинного текста:
using System.Net;
using System.Net.Sockets;
using System.Text;
TaskCompletionSource ready = new();
Task server = Task.Run(async () =>
{
using UdpClient listener = new(18081);
ready.SetResult();
UdpReceiveResult packet = await listener.ReceiveAsync();
Console.WriteLine(packet.Buffer.Length); // выведет 7
});
await ready.Task;
using UdpClient sender = new();
await sender.SendAsync(Encoding.UTF8.GetBytes("probe-2"), "127.0.0.1", 18081);
await server;
Примите один пакет с текстом "ready" и
выведите его в консоль одной строкой.
После приема текста "metric" выведите
число символов в полученной строке.