與同步Accept
不同,BeginAccept
不爲新創建的連接提供套接字。但是,它也阻止未來的連接被接受;所以我炮製瞭如下代碼,允許多個「客戶」連接到我的服務器:對於多個連接使用Socket.BeginAccept/EndAccept
serverSocket.BeginAccept(AcceptCallback, serverSocket);
AcceptCallback
代碼:
void AcceptCallback(IAsyncResult result)
{
Socket server = (Socket)result.AsyncState;
Socket client = server.EndAccept(result);
// client socket logic...
server.BeginAccept(AcceptCallback, server); // <- continue accepting connections
}
有沒有更好的方式來做到這一點?它似乎有點'hacky',因爲它本質上是遞歸地循環異步調用。
也許有多個調用異步方法的開銷,例如創建多個線程?
你是什麼意思,「它也阻止未來的連接被接受?」套接字繼續偵聽新連接,但您必須調用某種形式的「接受」來接受每個新連接。使用異步或同步與此無關。 – heavyd
不,這是編寫此代碼的正常方法。它不是遞歸的。 –
可以在MSDN上找到使用'ManualResetEvent'的替代方法:http://msdn.microsoft.com/en-us/library/fx6588te.aspx – heavyd