免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: wflyfox
打印 上一主题 下一主题

长连接中发送“心跳包”的时机 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-09-10 16:10 |只看该作者
原帖由 wflyfox 于 2007-9-10 16:09 发表
alarm设置定时,时间到了会发出SIGALRM信号,然后在信号处理函数中做处理
这是不是实现定时?

不知道算不算定时了呢?还有别的办法吗?

论坛徽章:
0
12 [报告]
发表于 2007-09-10 16:16 |只看该作者
“最优雅的方法是使用RTC机制。利用select函数,你可以用单线程实现定时器,同时还可以处理其它任务”

http://www.newbooks.com.cn/info/35396.html

论坛徽章:
0
13 [报告]
发表于 2007-09-10 16:23 |只看该作者
心跳包目的是防止网络连接意外断开而程序没有检测到,所以发送心跳包,心跳包发送不用太频繁,包的结构也是越简单越好;发包可以几分钟发一次,然后10秒或者20秒这样检查有没有包返回,这样就不占用系统资源。因为心跳包本身很小,发送间隔时间又比较长,所以可以不用判断是否空闲,固定发送就可以了。

论坛徽章:
0
14 [报告]
发表于 2007-09-10 16:27 |只看该作者
应该是这样的,网络正常断开的话,recv会返回0。
现在的问题在于,如何实现这个定时发送呢?alarm,setitimer?

论坛徽章:
0
15 [报告]
发表于 2007-09-10 16:32 |只看该作者

回复 #14 wflyfox 的帖子

其实可以不用alarm,setitimer(当然也可以用)
简单的方法是:你发送心跳包后设置一下时间,当收到返回时再设置一下时间;同时你程序每隔一段时间检查有无心跳包返回,这样就OK了

论坛徽章:
0
16 [报告]
发表于 2007-09-10 16:36 |只看该作者
原帖由 week008 于 2007-9-10 16:32 发表
其实可以不用alarm,setitimer(当然也可以用)
简单的方法是:你发送心跳包后设置一下时间,当收到返回时再设置一下时间;同时你程序每隔一段时间检查有无心跳包返回,这样就OK了


能不能写个伪码的例子?

论坛徽章:
0
17 [报告]
发表于 2007-09-10 16:55 |只看该作者
原帖由 wflyfox 于 2007-9-10 16:36 发表


能不能写个伪码的例子?



#define SEND_INTERVAL 120  //每隔2分钟发送心跳包
#define CHECK_INTERVAL  10  //每隔10秒检查心跳包是否正常

send_time  //发送心跳包时间
recv_time  //接收新跳包时间,每次收到新跳包回复重置这个值
now_time   //现在的时间



if(now_time % CHECK_INTERVAL == 0)  
{
     if(now_time - recv_time > 2 * SEND_INTERVAL)
                  断开连接;
   if(now_time - send_time > SEND_INTERVAL)
    {
       发送心跳包;
     重新设置send_time;
   }
}

论坛徽章:
0
18 [报告]
发表于 2007-09-10 17:03 |只看该作者
多谢先,看看

论坛徽章:
0
19 [报告]
发表于 2007-09-10 17:09 |只看该作者
#include <stdio.h>

#include <linux/rtc.h>

#include <sys/ioctl.h>

#include <sys/time.h>

#include <sys/types.h>

#include <fcntl.h>

#include <unistd.h>

#include <errno.h>



int main(int argc, char* argv[])

{

    unsigned long i = 0;

    unsigned long data = 0;

    int retval = 0;

    int fd = open ("/dev/rtc", O_RDONLY);



    if(fd < 0)

    {

        perror("open");

        exit(errno);

    }



    /*Set the freq as 4Hz*/

    if(ioctl(fd, RTC_IRQP_SET, 4) < 0)

    {

        perror("ioctl(RTC_IRQP_SET)");

        close(fd);

        exit(errno);

    }

    /*Set the freq as 4Hz*/

    if(ioctl(fd, RTC_IRQP_SET, 4) < 0)

    {

        perror("ioctl(RTC_IRQP_SET)");

        close(fd);

        exit(errno);

    }



    /* Enable periodic interrupts */

    if(ioctl(fd, RTC_PIE_ON, 0) < 0)

    {

        perror("ioctl(RTC_PIE_ON)");

        close(fd);

        exit(errno);

    }



    for(i = 0; i < 100; i++)

    {

        if(read(fd, &data, sizeof(unsigned long)) < 0)

        {

            perror("read");

            close(fd);

            exit(errno);

        }

        printf("timer\n");

    }

    /* Disable periodic interrupts */

    ioctl(fd, RTC_PIE_OFF, 0);

    close(fd);



    return 0;

}

         

这个定时程序中没有用到select函数啊?

论坛徽章:
0
20 [报告]
发表于 2007-09-10 17:11 |只看该作者
不明白RTC是干吗的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP