【发布时间】:2013-07-05 22:56:46
【问题描述】:
据我了解,这些行:
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);
}
【问题讨论】:
-
否;其中之一是阻塞并浪费线程。
-
异常说明了什么?
-
尝试重现自己并查看 ;) 当在同一个程序实例中进行测试时,TcpListener 在接受大约 2500 个连接后抛出 SocketException “现有连接被远程主机强制关闭”。如果 TcpListener 和 TcpClients 在不同的程序实例中,那么 TcpListener 只是停止接受连接,没有任何异常,并且 TcpClient 在建立大约 120 个连接后抛出 SocketException "An existing connection was forced by the remote host"。
标签: c# asynchronous tcp async-await tcplistener