当前位置: 技术问答>linux和unix
用socket编程中,怎样及时的知道非正常断开的TCP连接!!
来源: 互联网 发布时间:2015-11-11
本文导语: 用socket编程中,怎样及时的知道非正常断开的TCP连接!! 我知道用心跳包测试可以实现,一种是通过系统检测,一种是手动检测。 我参考了一些资料,在socket中通过setsockopt函数设置套接口,可以实现。其中有这样的...
用socket编程中,怎样及时的知道非正常断开的TCP连接!!
我知道用心跳包测试可以实现,一种是通过系统检测,一种是手动检测。
我参考了一些资料,在socket中通过setsockopt函数设置套接口,可以实现。其中有这样的一个材料:
Linux平台下
#include
……
////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_TEXT ("(%P|%t) setsockopt TCP_KEEPCNT error!n")));
}
测试中表明,当Linux服务器设定了KeepAlive
以上资料,本人不理解,写入程序中,编译时TCP_KEEPIDLE,TCP_KEEPINTVL,TCP_KEEPCNT几个变量无法识别。
请高手们帮帮忙,到底怎样才能及时的知道非正常断开的TCP连接!!谢谢啦!!
我知道用心跳包测试可以实现,一种是通过系统检测,一种是手动检测。
我参考了一些资料,在socket中通过setsockopt函数设置套接口,可以实现。其中有这样的一个材料:
Linux平台下
#include
……
////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_TEXT ("(%P|%t) setsockopt TCP_KEEPCNT error!n")));
}
测试中表明,当Linux服务器设定了KeepAlive
以上资料,本人不理解,写入程序中,编译时TCP_KEEPIDLE,TCP_KEEPINTVL,TCP_KEEPCNT几个变量无法识别。
请高手们帮帮忙,到底怎样才能及时的知道非正常断开的TCP连接!!谢谢啦!!
|
http://community.csdn.net/Expert/topic/4566/4566440.xml?temp=.7585108
这个帖子大家谈得较多了
我觉得你应该看看
这个帖子大家谈得较多了
我觉得你应该看看
|
netinet/tcp.h里没有定义吗?
|
netinet/tcp.h中没有.
我怀疑我查的资料到底对不对了!
有没有更好的方法吗?
我怀疑我查的资料到底对不对了!
有没有更好的方法吗?