我在寻找使用 C#
中的 UdpClient
类接收和处理消息的最佳解决方案。请问有人有相关的解决方案吗?
尝试使用以下代码:
//Client uses as receive udp client
UdpClient Client = new UdpClient(Port);
try
{
Client.BeginReceive(new AsyncCallback(recv), null);
}
catch(Exception e)
{
MessageBox.Show(e.ToString());
}
//CallBack
private void recv(IAsyncResult res)
{
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 8000);
byte[] received = Client.EndReceive(res, ref RemoteIpEndPoint);
//Process codes
MessageBox.Show(Encoding.UTF8.GetString(received));
Client.BeginReceive(new AsyncCallback(recv), null);
}
MessageBox.Show
进行错误处理可能不是一个好主意,但我假设你只是举个例子。其次,在处理数据项之前立即调用下一个 BeginReceive
可能更好——而不是在处理数据项之后再调用。否则,当您处理数据时可能会错过到达的消息。当然,这时您的异步回调必须是可重入的(即线程安全的),但它本来就应该是这样的。 - Jim Mischelrecv
? - EgoPingvina对于使用TAP而非Begin/End方法的较新技术,您可以在.NET 4.5中使用以下方法
非常简单!
private static void UDPListener()
{
Task.Run(async () =>
{
using (var udpClient = new UdpClient(11000))
{
string loggingEvent = "";
while (true)
{
//IPEndPoint object will allow us to read datagrams sent from any source.
var receivedResults = await udpClient.ReceiveAsync();
loggingEvent += Encoding.ASCII.GetString(receivedResults.Buffer);
}
}
});
}
与上述的异步
方法相反,这也可以以非常类似的方式实现同步
方法:
private static void UDPListener()
{
Task.Run(() =>
{
using (var udpClient = new UdpClient(11000))
{
string loggingEvent = "";
while (true)
{
//IPEndPoint object will allow us to read datagrams sent from any source.
var remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
var receivedResults = udpClient.Receive(ref remoteEndPoint);
loggingEvent += Encoding.ASCII.GetString(receivedResults);
}
}
});
}
我可以推荐两个关于这个解决方案的链接,对我很有帮助。
第一个链接提供了一个非常简单的解决方案,但是在修改时要小心,因为只有在首先向“远程”设备发送某个 UDP 数据包后,连续接收才能正常工作。 为了持续监听,请在每次读取传入数据后添加代码行“udp.BeginReceive(new AsyncCallback(UDP_IncomingData), udp_ep);”,以启用新的 UDP 数据包接收。
第二个链接提供了一种使用多播 IP 地址(239.255.255.255 - 240.0.0.0)的好方法。