C语言 tcp 异常断开的检测代码?

hc_net 2014-10-08 12:42:53
网上找了一个检测代码如下:
#include <netinet/tcp.h>  
int set_tcp_keepAlive(int fd, int start, int interval, int count)
{
int keepAlive = 1;
if (fd < 0 || start < 0 || interval < 0 || count < 0) return -1;
//启用心跳机制,如果您想关闭,将keepAlive置零即可
if(setsockopt(fd,SOL_SOCKET,SO_KEEPALIVE,(void*)&keepAlive,sizeof(keepAlive)) == -1)
{
perror("setsockopt");
return -1;
}
//启用心跳机制开始到首次心跳侦测包发送之间的空闲时间
if(setsockopt(fd,SOL_TCP,TCP_KEEPIDLE,(void *)&start,sizeof(start)) == -1)
{
perror("setsockopt");
return -1;
}
//两次心跳侦测包之间的间隔时间
if(setsockopt(fd,SOL_TCP,TCP_KEEPINTVL,(void *)&interval,sizeof(interval)) == -1)
{
perror("setsockopt");
return -1;
}
//探测次数,即将几次探测失败判定为TCP断开
if(setsockopt(fd,SOL_TCP,TCP_KEEPCNT,(void *)&count,sizeof(count)) == -1)
{
perror("setsockopt");
return -1;
}
return 0;
}


这段函数代码是主动式检测TCP的,主要也是为检测,客户意外断电等

请教:能否用上面的函数指定IP 地址去判断,需要检测的IP 在目录下如: ip: 192.168.0.2 192.168.0.220 192.168.0.200 等

就是定时检测这些指定IP 是否有断开。

C TCP编程 刚接触不久,望请指教

谢谢

...全文
561 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
hc_net 2014-10-08
  • 打赏
  • 举报
回复
是只能做心跳处理,服务端定时给客户发包,判断是否在线
铖邑 2014-10-08
  • 打赏
  • 举报
回复
在服务端检测,只能是在连接里面做自定义的心跳处理了,你用别的办法,可能客户端没有公网地址,根本通不了
mujiok2003 2014-10-08
  • 打赏
  • 举报
回复
引用 6 楼 hc_net 的回复:
只要做一个主动式的检测就可以了,客户端不需要,我说的是类似于ping 只要知道,客户是否在线,不管是断电了还是网线断开状态
在所有待检测的主机上运行一个服务,定期给机群管理这报告自己状态。
mujiok2003 2014-10-08
  • 打赏
  • 举报
回复
你是要检测某个主机是否可达还是检测某个TCP 连接是否断开?
hc_net 2014-10-08
  • 打赏
  • 举报
回复
只要做一个主动式的检测就可以了,客户端不需要,我说的是类似于ping 只要知道,客户是否在线,不管是断电了还是网线断开状态
铖邑 2014-10-08
  • 打赏
  • 举报
回复
为什么还要做一个ping呢?你就在连接里面自己做个心跳包处理不就行了?
hc_net 2014-10-08
  • 打赏
  • 举报
回复
有函数可以实现吗,反正测试过用ping 是可以,但是特殊情况下是禁 ping的
风行踩火轮 2014-10-08
  • 打赏
  • 举报
回复
这个不行的,上面的函数是采用TCP的心跳机制进行检测的,如果需要检测指定IP的连接状态,可以自己通过心跳机制实现
铖邑 2014-10-08
  • 打赏
  • 举报
回复
不行!心跳是tcp实现操作的,没办法控制到某个ip
ouyh12345 2014-10-08
  • 打赏
  • 举报
回复
如果建立了端对端的tcp链接,当然可以判断是否断开 如果需要判断某些设备是否存活,试试组播

70,021

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧