UdpClient在同一端口上发送和接收异步

时间:2019-07-04 05:49:09

标签: c# .net task-parallel-library udpclient

我正在尝试使用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 :(得分:0)

感谢Ben Voigt在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;
    }
}

谢谢!