读书人

linux多线程 心跳机制如何实现呢

发布时间: 2013-09-24 10:59:52 作者: rapoo

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;


case 心跳回复: global = now();break;
}

你是这个意思吧??




读书人网 >UNIXLINUX

热点推荐