心跳包问题

ffs2008 2011-03-30 09:50:49
我写了个网络程序
服务端和客户端通信
我服务端给客户端发心跳包,如果客户端异常终止连接(比如断开网络连接)
服务端send函数返回-1失败 可以判断客户端断开了连接,
但是客户端怎么判断服务端是否断开连接?
如果我服务端每隔一分钟发一个心跳包给客户端
客户端是只须检测在3分钟内是否收够3个心跳包,
如果收够的话就维持连接
如果收不够的话就把套接字关了然后断开连接
是这样理解吗?
我在网上找了段代码
const char chOpt = 1; // True
// Set KeepAlive 开启保活机制, 防止服务端产生死连接
if (setsockopt(pdlg->serSocket, SOL_SOCKET, SO_KEEPALIVE, (char *)&chOpt, sizeof(chOpt)) == 0)
{
// 设置超时详细信息
tcp_keepalive klive;
klive.onoff = 1; // 启用保活
klive.keepalivetime = 1000 * 5; // 3分钟超时 Keep Alive
klive.keepaliveinterval = 1000 * 5; // 重试间隔为5秒 Resend if No-Reply
WSAIoctl
(
pdlg->serSocket,
SIO_KEEPALIVE_VALS,
&klive,
sizeof(tcp_keepalive),
NULL,
0,
(unsigned long *)&chOpt,
0,
NULL
);
}
这个该怎么理解!~
有了这个是不是就不用发心跳包了?
开启保活机制后怎么判断该连接是不是死连接?
...全文
240 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ffs2008 2011-03-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ouyh12345 的回复:]
都设置心跳包
非阻塞,select、recv或send时,如果返回值为-1,则连接中断
[/Quote]
用保活机制怎么实现?
chenjiawei007 2011-03-30
  • 打赏
  • 举报
回复
客户端也设置心跳的,用来判断。
设置心跳也有假死状态,有时候SOCKET连接是在的,但是心跳包在一段时间内没有收到就可能出现假死状态,这个要注意。
ouyh12345 2011-03-30
  • 打赏
  • 举报
回复
都设置心跳包
非阻塞,select、recv或send时,如果返回值为-1,则连接中断
jwybobo2007 2011-03-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 ffs2008 的回复:]
我写了个网络程序
服务端和客户端通信
我服务端给客户端发心跳包,如果客户端异常终止连接(比如断开网络连接)
服务端send函数返回-1失败 可以判断客户端断开了连接,
但是客户端怎么判断服务端是否断开连接?
如果我服务端每隔一分钟发一个心跳包给客户端
客户端是只须检测在3分钟内是否收够3个心跳包,
如果收够的话就维持连接
如果收不够的话就把套接字关了然后断开连接
是……
[/Quote]

不多说啥,你贴的那段代码可以实现心跳机制
西湖秀才 2011-03-30
  • 打赏
  • 举报
回复
保活机制对这个不合适,另外,判断三分钟是否收到三个心跳包不合适,你可以这么做,定义一个变量保存心跳失败次数,心跳连续失败N次才算心跳失败,如果在0到N-1时候收到了心跳,即将变量重新置0。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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