我正在尝试使用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;
}
这似乎是正确的还是有更好的方法?
谢谢。
答案 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;
}
}
谢谢!