用定时器检测与服务器的断开连接

本文关键字:断开 连接 服务器 定时器 检测 | 更新日期: 2023-09-27 18:09:25

我有一个客户端类型的应用程序,它从远程服务器接收数据包。由于某些原因,服务器有时会断开我的连接。有时在我的终端有一些问题,ISP掉线等。

我一直试图抓住这些例外和谷歌搜索答案,但最后每一个指向"制作计时器并定期检查接收到的数据包"。

现在我有一个接收所有传入流量的函数。

每次收到数据包时执行此函数。

现在我的想法是创建一个函数,将创建定时器让50秒的超时。此函数将在每次收到数据包时将定时器重置为0并重新启动。

如果计时器达到50秒,它将抛出错误"断开连接!"并遵循一些逻辑如何重新连接。

现在我的主要问题是…我不能"暂停"我的主要数据包接收功能。我试图使它在另一个线程,但程序不断重新创建新的线程,通过ID杀死线程是一个不好的做法,我没有走下那条路…然而。

这是我应该如何处理我的问题,还是有人有更好的主意?下面是我的包接收函数。
 public void OnReceive()
        {
           try
            {
               recv_pack = locSec.TrIncom();
                if (recv_pack != null)
                {
                    foreach (Packet packet in recv_pack)
                    {                     
                        byte[] packet_bytes = packet.GetBytes();
                        PacketHandler.HandlePacket(packet, locSec);
                        //here i would check for packet receive with timer                  
                        //CheckDisconnect();
                    }
                }
            }
            catch() 
            {}
        }

到目前为止,我已经想出了这个:

public bool CheckDisconnect()
{
    bool KeepGoing = true;
    for(int i = 0 ; i <= 50 && KeepGoing; i++ )
    {
        Thead.Sleep(1000);
        if(i == 50)
        {
            KeepGoing = false;
            Console.WriteLine("Disconnected!");
            // ... starting reconnect procedure
        }
    }
}

用定时器检测与服务器的断开连接

不确定我是否完全理解,但如果这两个函数在同一个线程中,你不能只是做一个全局变量来控制OnReceive()函数并将其设置为false在你的CheckDisconnect()函数?