免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2264 | 回复: 2
打印 上一主题 下一主题

select 阻塞 keep alive [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-11 16:49 |只看该作者 |倒序浏览
各位,
    有没有碰到过类似的问题:创建了TCP, UDP的 socket  放到select 中监听对端发送的消息,其中有对端发送的keep alive 消息,当自己收到此消息时发送ACK。当对端接收不到ACK时就把TCP close掉。问题出现了, 当应用对端发来的配置消息时间超过keep alive 时间间隔就来不及处理keep alive 消息并发送ACK消息 结果对端就close 了 TCP。例如keep alive 时间间隔是30s,结果应用配置时间是50s,对端就close了TCP。
    有没有好的解决办法?
    先谢了。。。

论坛徽章:
0
2 [报告]
发表于 2012-06-11 17:24 |只看该作者
本帖最后由 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;


}

论坛徽章:
0
3 [报告]
发表于 2012-06-12 15:23 |只看该作者
首先谢谢您给的解决办法!

应用配置时间就是指本地有个操作运行的时候为50s太长,所以导致程序没机会执行recv函数处理心跳消息。 是这个意思吗?

答:这个模块是单进程的,也就是通信部分和处理部分放到了一起,配置消息和keep alive消息都是在同一个TCP 中接收和处理的, 结果收到大量配置消息后开始应用,要把这些配置捅到驱动去生效,生效后返回给此模块,所以用时比较长。在应用时keep alive 消息已存在于内核中的接收队列中,但此模块没机会把它read上来,就是这样意思。

  你说的分为几个阶段,执行一个阶段后,记录下来此时的阶段,这种方法确实可行但就像你说的比较复杂,呵呵
  你说的那个信号处理的方法,感觉不可行啊,因为if(收到keep-alive包) 无法检测到。

  目前我们采用了新开了线程来处理keep alive 后续会把这个模块分解为通信部分和处理部分 。。。

  总之谢谢。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP