さまざまな着信ポート (~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 Message が呼び出されることを理解しています...
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 メソッドが再帰的に何度も自分自身を呼び出すというまれなケースで、スタック オーバーフローを防ぐ最善の方法は何ですか?