Ответ по UDP в C#
Ответ по UDP шлют на адрес, который уже лежит в принятой датаграмме.
После ReceiveAsync адрес отправителя
доступен в свойстве RemoteEndPoint
результата. Ответ собирают из короткого текста
и шлют тем же сокетом через SendAsync
на этот адрес. Приемник ждет в фоновой задаче,
а запрос уходит из основного потока.
Приемник прочитает запрос и вернет короткое подтверждение:
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 request = await listener.ReceiveAsync();
await listener.SendAsync(Encoding.UTF8.GetBytes("ack"), request.RemoteEndPoint);
});
await ready.Task;
using UdpClient sender = new();
await sender.SendAsync(Encoding.UTF8.GetBytes("ping"), "127.0.0.1", 18081);
UdpReceiveResult answer = await sender.ReceiveAsync();
Console.WriteLine(Encoding.UTF8.GetString(answer.Buffer));
Текст ответа можно выбрать по содержимому запроса,
а адрес назначения по-прежнему берут из
RemoteEndPoint принятой датаграммы.
На строку "hello" вернут "got it",
на любую другую - "ack":
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 request = await listener.ReceiveAsync();
string incoming = Encoding.UTF8.GetString(request.Buffer);
string reply = incoming == "hello" ? "got it" : "ack";
await listener.SendAsync(Encoding.UTF8.GetBytes(reply), request.RemoteEndPoint);
});
await ready.Task;
using UdpClient sender = new();
await sender.SendAsync(Encoding.UTF8.GetBytes("hello"), "127.0.0.1", 18081);
UdpReceiveResult answer = await sender.ReceiveAsync();
Console.WriteLine(Encoding.UTF8.GetString(answer.Buffer));
На порту 18082 на датаграмму
"time" верните текущую минуту числом,
на любой другой текст - "unknown".