日期:2014-05-16  浏览次数:20846 次

linux多线程 心跳机制怎么实现呢?

    TCP服务,长连接。
    首先一个s(服务器)和一个c(客户端)建立TCP连接,S向C发送数据。C有两个线程:一个收数据;一个将数据保存到本地,保存成功以后向S回复一个确认。
    因为是长连接,所以要加一个心跳检测,C每隔100秒向S发一个心跳数据包,S收到包以后会给C一个回复。如果C没有在10秒内收到回复,则再次向S发心跳包,如果仍然没有在10秒内收到回复,则认为连接已经断了,则需要重新connect服务器。
基本功能实现了,现在缺少心跳检测功能。心跳怎么实现呢?听起来简单,实现起来发现不容易,各位大牛指点一下啊

linux??多线程?心跳检测?TCP

------解决方案--------------------
在通信的循环里使用gettimeofday之类的函数获取时间
发送的时候记录一次时间,每次或每N次进循环体再获取时间,判断10s是不是过去了,如果过去了就判断有没收到确认包 
------解决方案--------------------
想法没错,问题是你所用的类似kernel里面的del_timer之类的函数,linux应用层没有。
我上面说的是应用层可用timer的一种方式
------解决方案--------------------
引用:
Quote: 引用:

想法没错,问题是你所用的类似kernel里面的del_timer之类的函数,linux应用层没有。
我上面说的是应用层可用timer的一种方式


#include<linux/timer.h>这样不行吗?

另外你的思路是:
心跳线程:
while(1)
{
   if (flag == 0)
   {
       break; //跳出while,重新连接
   }
    sleep(100 - i * 1);
    time_now = now();
    global = time_now + 20; //将全局变量设的比较大。
    for (i = 0; i < 10; i++)
    {
        sleep(1);
        if (global - time_now < 10)
        {
           flag = 1; //表示收到了回复
           break;
        } 
    }
    if (i == 10) flag = 0; //表示没收到回复
}
connect();

接收线程:
for( ; ; )
{
    read(sock, buf[], n);
    switch (buf[0])
      case data: xxx;break;