如何在多个线程上平衡接收到的 udp 数据包?
How do I load balance received udp packets over multiple threads?
我正在创建一个应用程序,它将通过 udp 数据包发送和接收大量数据。我希望能够通过添加或减少更多工作线程来扩展对这些请求的处理。但是,当我添加第二个线程并开始等待数据时,出现以下错误。
“通常只允许每个套接字地址 (protocol/network address/port) 使用一次”
代码:
static void Main(string[] args)
{
Console.WriteLine("Running...");
Thread threadA = new Thread(new ThreadStart(ProcessMessage));
Thread threadB = new Thread(new ThreadStart(ProcessMessage));
threadA.Start();
threadB.Start();
Console.WriteLine("Press any key.");
Console.ReadLine();
}
private static void ProcessMessage()
{
using (var udpClient = new UdpClient(11000))
{
var sender = new System.Net.IPEndPoint(IPAddress.Any, 11000);
var data = udpClient.Receive(ref sender);
// Do work
}
}
错误很明显,但我的问题是:如何在多个线程之间正确分配工作?
感谢您的帮助,对于任何拼写错误,我们深表歉意。
我的母语不是英语。
C.Gonzalez的评论很有帮助,所以我将其作为正确答案放在这里。
处理大量 UDP 的常用方法是让一个线程尽可能快地使用数据(并将消息的内容放入队列中)。 (任何较新的硬件接收数据的速度与网络发送数据的速度一样快)一个或多个其他线程清空并处理数据。如果需要响应,可以将其放入传出队列中,供另一个专用线程将消息发送出去(您可以使用与该专用线程相同的套接字)。同样,任何相对较新的硬件都可以轻松地以线速发送和接收双工模式。
我正在创建一个应用程序,它将通过 udp 数据包发送和接收大量数据。我希望能够通过添加或减少更多工作线程来扩展对这些请求的处理。但是,当我添加第二个线程并开始等待数据时,出现以下错误。
“通常只允许每个套接字地址 (protocol/network address/port) 使用一次”
代码:
static void Main(string[] args)
{
Console.WriteLine("Running...");
Thread threadA = new Thread(new ThreadStart(ProcessMessage));
Thread threadB = new Thread(new ThreadStart(ProcessMessage));
threadA.Start();
threadB.Start();
Console.WriteLine("Press any key.");
Console.ReadLine();
}
private static void ProcessMessage()
{
using (var udpClient = new UdpClient(11000))
{
var sender = new System.Net.IPEndPoint(IPAddress.Any, 11000);
var data = udpClient.Receive(ref sender);
// Do work
}
}
错误很明显,但我的问题是:如何在多个线程之间正确分配工作?
感谢您的帮助,对于任何拼写错误,我们深表歉意。 我的母语不是英语。
C.Gonzalez的评论很有帮助,所以我将其作为正确答案放在这里。
处理大量 UDP 的常用方法是让一个线程尽可能快地使用数据(并将消息的内容放入队列中)。 (任何较新的硬件接收数据的速度与网络发送数据的速度一样快)一个或多个其他线程清空并处理数据。如果需要响应,可以将其放入传出队列中,供另一个专用线程将消息发送出去(您可以使用与该专用线程相同的套接字)。同样,任何相对较新的硬件都可以轻松地以线速发送和接收双工模式。