UdpClient отправлять и получать асинхронные на тот же порт - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь отправить данные с помощью UdpClient на аппаратное устройство, которое затем отправляет «ответ» на тот же порт.

Очевидно, я впервые столкнулся с проблемой, что все остальные пытались сделать то же самое, и понял, что я должен был сделать это, используя 2 UdpClients.

Я видел несколько примеров, но ничего, что бы полностью соответствовало моим потребностям.

Я пришел к следующему решению, которое, похоже, работает, но я ищу какое-то подтверждение от гуру.

public async Task< byte[] > ReceiveAsync( byte[] datagram, CancellationToken cancellationToken )
{
    byte[] buffer = null;

    var tasks = new List< Task >
    {
        Task.Run( async () =>
        {
            using ( var client = new UdpClient( 5555 ) )
            {
                client.Client.ReceiveTimeout = 200;
                var receiveDatagram = await client.ReceiveAsync();
                buffer = receiveDatagram.Buffer;
            }
        }, cancellationToken ),
        Task.Run( async () =>
        {
            using ( var client = new UdpClient() )
            {
                client.Connect( "10.0.0.50", 5555 );
                await client.SendAsync( datagram, datagram.Length );
            }
        }, cancellationToken )
    };

    await Task.WhenAll( tasks.ToArray() );
    return buffer;
}

Кажется ли это правильным или есть лучший способ?

Спасибо.

1 Ответ

0 голосов
/ 04 июля 2019

Благодаря вкладу Бена Фойгта в метод Connect (не использовать) я понял, что должен был также использовать номер порта в конструкторе UdpClient (который сначала казался избыточным, так как я подключался к нему).

Новое решение намного проще, чище и работает:)

public static async Task< byte[] > ReceiveAsync( byte[] datagram )
{
    using ( var client = new UdpClient( 5555 ) )
    {
        client.Client.ReceiveTimeout = 200;
        await client.SendAsync( datagram, datagram.Length, "10.0.0.50", 5555 );
        var buffer = await client.ReceiveAsync();
        return buffer.Buffer;
    }
}

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...