c#Tcp listener ....客户端拒绝连接

时间:2016-01-17 12:02:42

标签: c# multithreading sockets tcp tcplistener

我遇到了一个有趣的场景。

  1. 创建一个简单的Tcp侦听器。

    while (true)
    {
         Helper.LogMessage("Waiting for connections..." + _clients.Count);
         var tcpClient = await tcpListener.AcceptTcpClientAsync();
         ProcessSocket(tcpClient);
    }
    
  2. ProcessSocket-> work被卸载到新线程(据我所知,线程池)

    private void ProcessSocket(TcpClient client)
    {
        //if (socket == null) { break; }
        Task.Run(() => {
            //stuff and things like read the client msg...
            Thread.Sleep(5000);
        });
    }
    
  3. 客户正在给予: 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);
            }
        }
    

1 个答案:

答案 0 :(得分:1)

我会尝试第一个答案,虽然我还在等待您的TCPView结果:
看看MSDN Socket.Listen(),我非常确定它也是TCPListener的基础对象,以及TCPClient的基础对象。该网站将告诉你

  

Listen会导致面向连接的Socket侦听传入的连接尝试。 backlog参数指定可以排队等待接受的传入连接数。要确定可以指定的最大连接数,请检索MaxConnections值。听不会阻止。

因此,挂起的连接存在限制。如果还存在开放式连接的限制,那么您只需添加两个值即可了解您的测试结果。♦ 通常,您的服务器需要能够在新的连接到达时更快地处理(和关闭)连接,以避免在客户端拒绝。
我建议您在客户端添加时间戳列表,以便了解创建连接的速度和发送数据的速度。

我会在有新信息时更新我的​​答案。您也应该更新您的帖子,因此我们不会添加无穷无尽的评论列表。