sevencat 发表于 2012-5-3 17:29:13

有些小区别。

////KeepAlive实现
//下面代码要求有ACE,如果没有包含ACE,则请把用到的ACE函数改成linux相应的接口
int keepAlive = 1;//设定KeepAlive
int keepIdle = 5;//开始首次KeepAlive探测前的TCP空闭时间
int keepInterval = 5;//两次KeepAlive探测间的时间间隔
int keepCount = 3;//判定断开前的KeepAlive探测次数
if(setsockopt(s,SOL_SOCKET,SO_KEEPALIVE,(void*)&keepAlive,sizeof(keepAlive)) == -1)
{
    ACE_DEBUG ((LM_INFO,
    ACE_TEXT ("(%P|%t) setsockopt SO_KEEPALIVE error!\n")));
}
if(setsockopt(s,SOL_TCP,TCP_KEEPIDLE,(void *)&keepIdle,sizeof(keepIdle)) == -1)
{
    ACE_DEBUG ((LM_INFO,
    ACE_TEXT ("(%P|%t) setsockopt TCP_KEEPIDLE error!\n")));
}
if(setsockopt(s,SOL_TCP,TCP_KEEPINTVL,(void *)&keepInterval,sizeof(keepInterval)) == -1)
{
    ACE_DEBUG ((LM_INFO,
    ACE_TEXT ("(%P|%t) setsockopt TCP_KEEPINTVL error!\n")));
}
if(setsockopt(s,SOL_TCP,TCP_KEEPCNT,(void *)&keepCount,sizeof(keepCount)) == -1)
{
    ACE_DEBUG ((LM_INFO,
    ACE_TEX

wesom 发表于 2012-5-3 17:49:53

自己写要不了多少代码量,如果延时厉害或是假连接,查起原因来也方便些

qq496683952 发表于 2012-5-4 11:23:23

sevencat 发表于 2012-5-3 17:29 static/image/common/back.gif
有些小区别。

////KeepAlive实现


还是谢谢你,虽然这个是度娘能问到的
不过我的问题没有解答

qq496683952 发表于 2012-5-4 11:23:53

wesom 发表于 2012-5-3 17:49 static/image/common/back.gif
自己写要不了多少代码量,如果延时厉害或是假连接,查起原因来也方便些

还是自己写心跳包算了.
可控性强点.

sunlock 发表于 2012-6-1 16:14:36

可以使用,设置这个后,但网络出问题,得到的回调或通知,与正常情况下,对端close掉,你这一侧表现的形式是一样的。
我没有说什么函数会被调用,是因为 有多种连接的实现方式。


windows和linux是一样的。只是linux的时间设置时要注意,好像不能小于1s,windows下可以随便说。

自己在应用层实现keepalive,当然是可以的。但是好多人说这话 是站着说话不腰疼,真正自己实现起来还是有一定的工作量。
页: 1 [2]
查看完整版本: ACE中keepalive的疑问