据我所知,这些台词:
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);
}
发布于 2013-11-06 17:00:10
你的测试连接被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个连接。
发布于 2013-07-08 14:54:33
您不能在一台机器上有100,000个连接。TCP/IP只有16 bits for a port number (maximum 64k ports),并且其中有大量用于(或保留)操作系统或各种服务。
通常,传入客户端连接的only 16,383 of these ports are available,您需要与all the other processes that use TCP/IP regularly共享它们。
https://stackoverflow.com/questions/17529529
复制