c#通过计时器检测与服务器的断开连接

时间:2015-08-24 12:04:10

标签: c# tcp packet

我有一个客户端类型的应用程序正在从远程服务器接收数据包。 偶尔会发生由于某种原因服务器断开连接的情况。 有时在我的终端ISP丢失互联网等问题。

我一直试图抓住那些例外和goog-ling以获得答案,但最后每一个 指向“定时器并定期检查收到的数据包。”

现在我有一个接收所有传入流量的功能。 每次收到数据包时都会执行此功能。

现在我的想法是创建一个函数,创建计时器,让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
        }
    }
}

1 个答案:

答案 0 :(得分:1)

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

相关问题