繁体   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