接続をリッスンすることから始まるプログラムがあります。私は、サーバーが接続を受け入れ、その個々の接続を処理のためにユーザー クラスに渡すパターンを実装したいと考えていました。将来のパケット受信とデータの処理です。
クラスの非同期使用がSocket
怖くないことがわかる前に、同期パターンで問題が発生しました。しかし、その後、さらに問題が発生しました。は非同期であるため、while (true)
ループ内でBeginAccept()
は、プログラムは常にこのループを移動し、最終的にOutOfMemoryException
. 接続をリッスンし、すぐにその接続の責任を他のクラスに引き渡すものが必要でした。
そこで、Microsoft の例を読んで、ManualResetEvent
. ループが再びリッスンを開始する準備ができたときを実際に指定できました! しかし、スタック オーバーフローに関するいくつかの質問を読んだ後、私は混乱してしまいました。
私の心配は、接続を非同期に受け入れたとしても、ループに再び入るときに新しい接続をリッスンしようとしている間、プログラム全体がブロックされることです。複数のユーザーを扱っている場合、これは理想的ではありません。
私は非同期 I/O の世界に非常に慣れていないので、私の語彙やフレーズの誤用についての最も怒っているコメントでも感謝します。
コード:
static void Main(string[] args)
{
MainSocket = new Socket(SocketType.Stream, ProtocolType.Tcp);
MainSocket.Bind(new IPEndPoint(IPAddress.Parse("192.168.1.74"), 1626));
MainSocket.Listen(10);
while (true)
{
Ready.Reset();
AcceptCallback = new AsyncCallback(ConnectionAccepted);
MainSocket.BeginAccept(AcceptCallback, MainSocket);
Ready.WaitOne();
}
}
static void ConnectionAccepted(IAsyncResult IAr)
{
Ready.Set();
Connection UserConnection = new Connection(MainSocket.EndAccept(IAr));
}