gpt4 book ai didi

c# - 套接字监听器多个同时的AcceptAsync调用

转载 作者:行者123 更新时间:2023-12-03 11:59:50 24 4
gpt4 key购买 nike

因此,我一直在研究套接字编程,并继续阅读创建高性能服务器的方法。

阅读有关使用AcceptAsyncSocket方法的信息,以及在连接立即可用时调用有时如何同步执行(并返回false)以及如何在接受连接后将套接字重新置于监听状态的内容,我开始想知道这是否意味着确实,尽管接受AcceptAsync接受连接的套接字将“异步”等待,但即使一次连接1000个客户端,最终一次也只能处理1个新连接,具体取决于将客户端传递给另一个线程的速度如何。处理,可能会限制性能。

然后,这使我想知道是否可以考虑使用所有连接使用SocketAsyncEventArgs的单个实例,而不是本来打算使用的对象池来编写类。

我对此进行了更多思考,我想知道在这种情况下,如果在没有可用连接的情况下进行多次AcceptAsync调用会发生什么情况。因此,我制作了这个非常非常粗糙的测试应用程序,以了解会发生什么:

class Program
{
private static Socket s;

static void Main(string[] args)
{
s = new Socket(IPAddress.Any.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
s.Bind(new IPEndPoint(IPAddress.Any, 10001));
s.Listen(10);
var e = new SocketAsyncEventArgs();
e.Completed += EOnCompleted;
s.AcceptAsync(e);
e = new SocketAsyncEventArgs();
e.Completed += EOnCompleted;
s.AcceptAsync(e);
e = new SocketAsyncEventArgs();
e.Completed += EOnCompleted;
s.AcceptAsync(e);
e = new SocketAsyncEventArgs();
e.Completed += EOnCompleted;
s.AcceptAsync(e);
while (true)
{

}
}

private static void EOnCompleted(object sender, SocketAsyncEventArgs socketAsyncEventArgs)
{
Console.WriteLine(socketAsyncEventArgs.AcceptSocket.RemoteEndPoint);
Thread.Sleep(10000);
var e = new SocketAsyncEventArgs();
e.Completed += EOnCompleted;
s.AcceptAsync(e);
}
}

我使用了一个tcp测试应用程序,对该应用程序的连接进行垃圾邮件处理,结果表明,多个 AcceptAsync调用创建了多个“接受/完成”周期,这些周期似乎并行执行。

我的问题是,这实际上有什么好处吗?这是允许更快处理传入连接的合法方法吗?有什么缺点吗?

编辑1:进一步研究这似乎在技术上是可能的,如果数据始终可用于异步调用的处理,则它们将全部同步运行,并且永远不会返回接受新的连接,或者至少会出现严重的延迟。

如果确实如此,如何生产高性能服务器?

最佳答案

通常,仅需要以下代码:

while (true) {
var socket = listener.Accept();
Task.Run(async () => await RunConnectionAsync(socket));
}

此代码的用户模式部分将非常快速地运行。几乎所有时间都将花费在内核上。这将很快接受连接。由于内核管理的积压,不会删除任何连接。

很少需要有多个未完成的接受调用来实现您的性能目标。如果确实需要,只需在多个线程上运行相同的代码即可。
SocketAsyncEventArgs API已过时。基于任务的IO更加方便,并且占用大量CPU。

特别是,如果为每个操作创建一个新的 SocketAsyncEventArgs,那么您将失去该模式的所有好处。那是没有意义的。

在几乎所有情况下,都不需要异步IO从套接字接受。它花费更多的CPU时间来执行,因此延迟也稍长一些。

关于c# - 套接字监听器多个同时的AcceptAsync调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36487535/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com