- 论坛徽章:
- 0
|
本帖最后由 fdl19881 于 2012-06-11 20:38 编辑
应用配置时间就是指本地有个操作运行的时候为50s太长,所以导致程序没机会执行recv函数处理心跳消息。 是这个意思吗?
简单的解决方法是: 再开个线程专门处理keep alive消息。 OK
复杂的方法:将应用配置这个操作,分为几个阶段,执行一个阶段后,记录下来此时的阶段。然后让程序执行下别的(处理keep alive消息)
然后到此应用配置处了,再根据记录下的位置 ,执行下一个阶段的操作。
或者自己定义个异步处理的方法。
如下:
enume {start , stat1 , stat2 , stat3 , ok} stat = start;
while (1) {
n = select( )
if(ISSET(xx , xx))
handle_keep_alive();
switch(stat){
case stat1: xxx ;stat = stat2; break;
case stat2: xxx ;stat = stat3;break;
case stat3: xxx ;stat = ok; break;
default: ;
}
if(stat == OK) {
//正常运行阶段
}
}
假设把你的那步操作分成了三步: stat1 , stat2 , stat3 . 这样每次执行一次这个操作。
再或者可以使用信号处理的方法:
void handle_keep_alive(int signo)
{
if(收到keep-alive包) //是keep-alive包.但是是否已经收到信息那么,你再结合考虑下怎么实现。如用个全局变量表示。这里只是提供一种方法吧
send(); //ack
alarm(25); //放这每到时间就检查一次,,
}
main{
signal(SIGALRM , handle_keep_alive);
alarm(25);
//处理应用配置
xxxx;
}
|
|