我遇到了一个有趣的场景。
创建一个简单的Tcp侦听器。
while (true)
{
Helper.LogMessage("Waiting for connections..." + _clients.Count);
var tcpClient = await tcpListener.AcceptTcpClientAsync();
ProcessSocket(tcpClient);
}
ProcessSocket-> work被卸载到新线程(据我所知,线程池)
private void ProcessSocket(TcpClient client)
{
//if (socket == null) { break; }
Task.Run(() => {
//stuff and things like read the client msg...
Thread.Sleep(5000);
});
}
客户正在给予: System.Net.Sockets.SocketException
{"无法建立连接,因为目标计算机主动拒绝[IP地址]"}
NativeErrorCode:10061
测试....我试图模拟用新连接轰炸听众。
[TestMethod]
public void TestMethod2()
{
int cycles = 210;
List<int> items = new List<int>();
for (int i = 0; i < cycles; i++)
items.Add(i);
foreach (var item in items)
{
string ch = TestHelper.GetText() + item.ToString();
Send(ch);
//Thread.Sleep(10);
}
}
我想帮助弄清楚究竟发生了什么...... I.e。我怎么能监控这个......
它几乎立即发生......所以它不能用完线程......
代码的工作几乎和你预期的一样,如果你让线程休眠......
但我想知道为什么......这种情况正在发生。
额外代码
private void Send(string message)
{
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse(ClientAddress), ClientPort);
try
{
socket.Connect(ipEndPoint);
byte[] messageBytes = Encoding.Unicode.GetBytes(message);
socket.Send(messageBytes);
socket.Dispose();
//socket.Close();
}
catch (Exception ex)
{
Console.WriteLine("Could not connect to Host!: " + ex.Message);
}
}
答案 0 :(得分:1)
我会尝试第一个答案,虽然我还在等待您的TCPView结果:
看看MSDN Socket.Listen(),我非常确定它也是TCPListener
的基础对象,以及TCPClient
的基础对象。该网站将告诉你
Listen会导致面向连接的Socket侦听传入的连接尝试。 backlog参数指定可以排队等待接受的传入连接数。要确定可以指定的最大连接数,请检索MaxConnections值。听不会阻止。
因此,挂起的连接存在限制。如果还存在开放式连接的限制,那么您只需添加两个值即可了解您的测试结果。♦
通常,您的服务器需要能够在新的连接到达时更快地处理(和关闭)连接,以避免在客户端拒绝。
我建议您在客户端添加时间戳列表,以便了解创建连接的速度和发送数据的速度。
我会在有新信息时更新我的答案。您也应该更新您的帖子,因此我们不会添加无穷无尽的评论列表。