2012-11-12 57 views
4

與同步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',因爲它本質上是遞歸地循環異步調用。
也許有多個調用異步方法的開銷,例如創建多個線程?

+0

你是什麼意思,「它也阻止未來的連接被接受?」套接字繼續偵聽新連接,但您必須調用某種形式的「接受」來接受每個新連接。使用異步或同步與此無關。 – heavyd

+0

不,這是編寫此代碼的正常方法。它不是遞歸的。 –

+1

可以在MSDN上找到使用'ManualResetEvent'的替代方法:http://msdn.microsoft.com/en-us/library/fx6588te.aspx – heavyd

回答

1

當處理基於回調的異步IO時,這是正常的。而這正是使它如此可怕的使用!

你可以使用C#等待嗎?這將簡化爲一個簡單的while (true) { await accept(); }循環。

3

這樣做對於使用異步套接字是正確的。就我個人而言,在從AsyncState獲取套接字後,我會將您的BeginAccept移動到右側。這將允許您立即接受其他連接。現在,處理代碼將在您準備好接受其他連接之前運行。

正如Usr提到的,我相信你可以重新編寫代碼來使用等待任務。