我有一个关于this问题的疑问(“异步服务器套接字多个客户端”)。
要么微软已经改变了示例,要么我真的不明白——在示例中它说:
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();
}
据我所知,BeginAccept()函数在while(true)循环中被连续调用,只有在AcceptCallback()函数被调用并且第一件事情发生的时候才会停止,因为那里发生的第一件事情就是allDone.Set()。
但是Groo说:
“MSDN示例的问题在于它只允许连接一个客户端(listener.BeginAccept只调用了一次)。”
实际上,我不明白为什么要使用ManualResetEvent allDone...
而且我认为listener.EndAccept(ar)方法无论如何都是阻塞的。
如果在运行时再次调用listener.BeginAccept()会抛出异常吗? 但如果是这样的话,为什么allDone.Set()在listener.EndAccept(ar)之前?
还有一个问题:
在ReadCallback(IAsyncResult ar)函数中,当我收到EOF后,我可以直接调用handler.BeginReceive(...)来等待来自同一客户端的更多传入数据吗?
有经验的人可以解释一下吗?
谢谢!