Я пытаюсь прослушивать пакеты UDP с различных входящих портов (~ 20). Я хотел бы выделить ~ 3-5 потоков для получения и обработки этих пакетов. Это кажется идеальной ситуацией для портов завершения ввода-вывода в Windows. Чего я не понимаю, так это того, как выполнить сопоставление нескольких сокетов «многие к меньшему» для проверки меньшего набора потоков.
Следующий код создает все мои сокеты и начинает операцию асинхронного получения.
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 рекурсивно вызывает себя слишком много раз?