gpt4 book ai didi

c# - AcceptTcpClient 和 AcceptTcpClientAsync 区别

转载 作者:可可西里 更新时间:2023-11-01 02:33:40 26 4
gpt4 key购买 nike

据我了解,这些行:

var client = await listener.AcceptTcpClientAsync();

var client = listener.AcceptTcpClient();

应该以同样的方式工作,但是如果我尝试打开,例如,5k 连接(而不关闭它们),监听器(异步)很快就会停止响应或抛出异常。

有人知道哪里出了问题吗?

示例类:

class ListenerTest
{
static int connectionNumber = 0;
static int port = 23456;

public void StartListening(bool async)
{
var listener = new TcpListener(IPAddress.Any, port);
listener.Start();

if (async)
{
var task = HandleConnectionsAsync(listener);
task.Wait();
}
else
HandleConnections(listener);
}

async Task HandleConnectionsAsync(TcpListener listener)
{
while (true)
{
Console.Write("Waiting for async connection...");
var client = await listener.AcceptTcpClientAsync();
Console.WriteLine("OK #" + connectionNumber);
connectionNumber++;
}
}

void HandleConnections(TcpListener listener)
{
while (true)
{
Console.Write("Waiting for sync connection...");
var client = listener.AcceptTcpClient();
Console.WriteLine("OK #" + connectionNumber);
connectionNumber++;
}
}

public static void ConnectTest(int count)
{
var ep = new IPEndPoint(IPAddress.Loopback, port);
for (var i = 0; i < count; i++)
new TcpClient().Connect(ep);
}
}

用法:

static void Main(string[] args)
{
var isAsync = true;
ThreadPool.QueueUserWorkItem(new WaitCallback(StartListening), isAsync);
ListenerTest.ConnectTest(5000);
}

static void StartListening(object state)
{
var my = new ListenerTest();
my.StartListening((bool)state);
}

最佳答案

您的测试连接被 GC 杀死,如果您“固定”您的连接直到测试结束 - 您将获得 5000 个连接(我刚刚复制/粘贴并修复/测试了您的代码)。重写的连接测试:

    public static void ConnectTest(int count)
{
var ep = new IPEndPoint(IPAddress.Loopback, port);
List<TcpClient> clients = new List<TcpClient>();
for (var i = 0; i < count; i++)
{
TcpClient cl = new TcpClient();
clients.Add(cl);
cl.Connect(ep);
}
}

另请注意,在“真实世界”条件下,您需要在开始监听器循环之前添加如下内容:

ThreadPool.SetMinThreads(100, 100);

这让您的代码在“突发”连接计数/网络负载下工作。我们刚刚在 linux/mono 下成功地“负载测试”了 7,5K 个连接。

关于c# - AcceptTcpClient 和 AcceptTcpClientAsync 区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17529529/

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