我有一个关于这个问题的问题("异步服务器套接字多个客户端").
要么微软改变了这个例子,因为Groos回答或者我真的没有得到它 - 在示例中它说:
while (true) {
// Set the event to nonsignaled state.
allDone.Reset();
// Start an asynchronous socket to listen for connections.
Console.WriteLine("Waiting for a connection...");
listener.BeginAccept(
new AsyncCallback(AcceptCallback),
listener );
// Wait until a connection is made before continuing.
allDone.WaitOne();
}
Run Code Online (Sandbox Code Playgroud)
据我所知,在while(true)循环中连续调用BeginAccept()函数,只有在调用AcceptCallback()函数时才会被调用,因为首先发生的是allDone.Set().
但格罗说
MSDN示例的问题在于它只允许连接单个客户端(listener.BeginAccept只调用一次).
实际上我不明白为什么使用ManualResetEvent allDone ...而且我认为listener.EndAccept(ar)方法无论如何都是阻塞的.
listener.BeginAccept()是否在仍然运行时第二次调用时抛出异常?但是,如果是这样,为什么allDone.Set()在listener.EndAccept(ar)之前呢?
还有一个问题:
在收到EOF后,我可以在ReadCallback(IAsyncResult ar)函数中调用handler.BeginReceive(...)来等待来自同一客户端的更多数据吗?
任何有经验的人都可以向我解释一下吗?
谢谢 !