C#TCPListener在空闲阶段后停止监听

时间:2018-08-10 14:02:37

标签: c# multithreading tcp server listener

我试图弄清楚为什么为什么在客户端运行一段时间后没有任何客户端尝试连接的情况下我的客户端有时无法连接到服务器的原因。 修复它的唯一方法是重新启动TCP侦听器-服务器。 如果我启动服务器,并且有人在以后进行连接,处理和断开连接,则没有问题。

我有一个简单的while循环来接受传入的套接字连接:

            while (IsOn)
            {
                try
                {
                    if (!tcpListener.Pending())
                    {
                        Thread.Sleep(100);
                        continue;
                    }
                    Socket socket = tcpListener.AcceptSocket();
                    if (socket != null)
                    {
                        TcpClient client = new TcpClient();
                        client.Client = socket;
                        IncommingClientConnection(client); // Nonblocking Code
                    }
                }catch(Exception e)
                {
                    NetLog.Exception(e, "An error occured while user connected!");
                }
            }

上一次发生错误是在大约8个小时的空闲时间之后。有时它发生得更早。

我尝试调试此问题,但侦听器线程仍在运行,并且似乎挂起了

  

tcpListener.AcceptSocket()

我已经读到,可以通过设置Windows Service来解决此问题,但目前尚需大量工作。但是是否没有其他方法可以强制侦听器保持打开状态?

任何建议都非常感谢,谢谢!

1 个答案:

答案 0 :(得分:0)

我找出了错误所在。之所以如此荒谬,是因为冻结的线程为什么要与“ Console.WriteLine()”有关?!

问题是,Windows Server 2016上的控制台窗口以某种方式更改为输入模式。然后,该线程在“ Console.WriteLine”上阻塞,并等待用户在控制台窗口上按Enter。我尝试了一些方案。即使我一段时间没有触摸删除桌面,也会发生此问题。

解决方案:从控制台应用程序切换到Windows应用程序,并在集成的IDE控制台视图中跟踪输出。

我希望这可以帮助某人...