这是因为在停止监听后,仍然存在客户端连接的线程。当客户端连接时,会创建一个新的线程来处理该连接。当停止监听后,还可能存在一些正在处理的客户端连接线程。

要解决此问题,您可以在停止监听之前,先等待所有客户端连接的线程完成。一种简单的方法是使用一个标志变量来表示是否停止监听,并在处理客户端连接线程中检查该标志变量。

以下是修改后的代码示例:

private bool stopListening = false;

// 监听客户端连接并接收IP地址
private void ListenForClients()
{
    try
    {
        while (!stopListening)
        {
            if (listener.Pending()) // 检查是否有挂起的连接请求
            {
                TcpClient client = listener.AcceptTcpClient();

                Thread clientThread = new Thread(() => HandleClient(client));
                clientThread.Start();
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}

// 停止监听客户端连接
private void StopListening()
{
    stopListening = true;
    listener.Stop();
    // 等待所有客户端连接线程完成
    Thread.Sleep(1000); // 可根据实际情况调整等待时间
}

// 处理客户端连接
private void HandleClient(TcpClient client)
{
    try
    {
        // 处理客户端连接的逻辑
    }
    finally
    {
        client.Close();
    }
}

在停止监听时,首先将 stopListening 标志设置为 true,然后调用 listener.Stop() 来停止监听。接下来,通过 Thread.Sleep() 方法等待一段时间,以确保所有客户端连接的线程都有足够的时间来完成。最后,使用 client.Close() 关闭客户端连接。

请根据您的实际需求调整等待时间。如果您的客户端连接处理逻辑较复杂或耗时较长,可能需要增加等待时间

监听客户端连接并接收IP地址 private void ListenForClients try while true if listenerPending 检查是否有挂起的连接请求

原文地址: https://www.cveoy.top/t/topic/iy5S 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录