心跳包问题
我写了个网络程序
服务端和客户端通信
我服务端给客户端发心跳包,如果客户端异常终止连接(比如断开网络连接)
服务端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
);
}
这个该怎么理解!~
有了这个是不是就不用发心跳包了?
开启保活机制后怎么判断该连接是不是死连接?