我有一个程序,它通过监听连接开始。我想实现一种模式,其中服务器将接受一个连接,将该单独的连接传递给用户类进行处理:未来的数据包接收和数据处理。
Socket
在我发现类的异步使用并不可怕之前,我遇到了同步模式的麻烦。但后来我遇到了更多的麻烦。看起来,在一个while (true)
循环中,由于BeginAccept()
是异步的,程序会不断地通过这个循环并最终运行到一个OutOfMemoryException
. 我需要一些东西来监听连接,并立即将该连接的责任移交给其他班级。
因此,我阅读了 Microsoft 的示例并了解了ManualResetEvent
. 我实际上可以指定何时准备好让循环再次开始收听!但是在阅读了有关 Stack Overflow 的一些问题后,我变得困惑。
我担心的是,即使我已经异步接受了一个连接,整个程序在重新进入循环时尝试侦听新连接时也会阻塞。如果我要处理多个用户,这并不理想。
我对异步 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));
}