我正在尝试侦听来自各种传入端口(~20)的 UDP 数据包。我想用大约 3-5 个线程来接收和处理这些数据包。这似乎是 Windows 中 IO 完成端口的理想情况。我不明白的是如何对多个套接字进行多到少的映射以检查一组较小的线程。
以下代码创建我的所有套接字并开始异步接收操作。
for(int ix = 0; ix < 20; ix++)
{
var socket = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
socket.Bind(new IPEndPoint(IPAddress.Any, ix+6000));
var e = new SocketAsyncEventArgs();
e.Completed+=OnReceive;
e.SetBuffer(buffer, ix*1024*1024, 1024*1024);
socket.ReceiveFromAsync(e);
_sockets.Add(socket);
}
我知道收到数据包时将调用每个 OnReceive 消息...
static void OnReceive(object sender, SocketAsyncEventArgs e)
{
Console.WriteLine("Received {0} bytes", e.BytesTransfered);
if(!((Socket)sender).ReceiveFromAsync(e))
e_Completed(sender, e);
}
- 如何限制运行 OnReceive 事件的线程数?
- 在 OnReceive 方法递归调用自身太多次的极少数情况下,防止堆栈溢出的最佳方法是什么?