簡體   English   中英

使用SocketAsyncEventArgs編寫可擴展的套接字服務器

[英]Write high-scalable socket server using SocketAsyncEventArgs

好的,我讀了很多有關編寫可擴展服務器的問題,但是我從來沒有真正遇到一個好的答案。 無論如何,我都想創建一個可處理大量數據和連接的可擴展客戶端。 我創建的是一個使用SocketAsyncEventArgs和C#5 async / await的簡單客戶端,如下所示:

public async Task<int> SendAsync(byte[] buffer, int offset, int size)
{
    var socketArgs = new SocketAsyncEventArgs();
    var tcs = new TaskCompletionSource<int>();

    socketArgs.SetBuffer(buffer, offset, size);
    socketArgs.Completed += (sender, args) =>
    {
        tcs.SetResult(socketArgs.BytesTransferred);
        LastSocketError = socketArgs.SocketError;
    };

    if (_clientSocket.SendAsync(socketArgs)) 
        return await tcs.Task;

    LastSocketError = socketArgs.SocketError;
    return socketArgs.BytesTransferred;
}

還有ConnectAsync,ReceiveAsync和AcceptAcync的代碼。 這對於客戶端部分非常有用,但是在我的服務器上,我不知道如何正確處理它。(我最終將為每個要接收的客戶端創建一個線程。)我可以使用APM(開始/結束)或使用EventHandler,但這扼殺了使用async / await的目的,最后,為每個調用創建新的SocketAsyncEventArgs時,內存效率不高。 我嘗試創建一個池(使用ConcurrentBag),但是我仍然不得不一遍又一遍地創建TaskCompletionSource(因為您只能使用一次。)

因此,盡管我真的很喜歡,但我認為這不是創建它的好主意。創建高可擴展性和高性能服務器的最佳設計是什么?

當然,我們可以通過任務來調整此類異步方法,但這將大大削弱這些方法的目的,類似於在APM中分配IAsyncResult的目的。 但是,即使如此,我們仍希望能夠利用編譯器的async / await支持來促進使用套接字編寫異步代碼。 我們要我們的蛋糕,也吃。 當然,編譯器承認期望比Tasks要大。 因此,如果您有類似這樣的特殊情況,則可以利用基於編譯器模式的支持來等待事情。 詳細信息: https : //blogs.msdn.microsoft.com/pfxteam/2011/12/15/awaiting-socket-operations/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM