急!TCP的心跳包的问题

zhangystc 2008-03-23 08:19:01
最近做一个服务器,想要对客户端的状态进行实时的反映,比如客户端的正常退出,异常退出(如拔掉网线)
在Windows里的setsockopt里有个KEEPALIVE选项,好象是客户端才能用,服务器端用不了,谁能给点
心跳包的代码,或者讲下如何用KEEPALIVE这个选项来反映客户端的状态,越详细越好,谢谢各位大侠啊,
在线等!!!
...全文
1588 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
knowledge_Is_Life 2008-05-01
  • 打赏
  • 举报
回复
好像没那么简单,呵呵.
lp2007 2008-04-15
  • 打赏
  • 举报
回复
最好自己控制,这样可以随心所欲。
Conry 2008-04-01
  • 打赏
  • 举报
回复
WSAIoctl
anjuta_c 2008-03-31
  • 打赏
  • 举报
回复
so_keepalive选项的时间间隔是os内核的一个参数,而不是对每个socket都有一个时间间隔,所以设置时间间隔后会影响所有启用keepalive的socket.

这种心跳机制一般是在应用层协议实现,而不是利用tcp层的keepalive.
fox1999 2008-03-31
  • 打赏
  • 举报
回复
為什麼都說不要KeepAlive ???

我在實際中用了,發覺還是不錯的。

我在我的 Blog 有寫

http://redsoft.ycool.com/post.2746038.html
anjuta_c 2008-03-31
  • 打赏
  • 举报
回复
keepalive这种东东一般就是在服务器端使用的,如果看过telnetd服务器端的代码,一般都会看到设置so_keepalive.

如果某个socket设置了keepalive选项后,如果在一定的时间间隔内(os 内核参数)socket上双方都没有收发数据,tcp协议栈会在这个socket上发送一个"探测分节"(和ack,rst,fin,这些tcp分节类似),导致有三种结果
1.对方tcp协议栈以ack回复,代表持有该socket句柄的进程存在,并且句柄未关闭,这个应用进程得不到通知(如果得到通知,recv一般会返回-1),代表正常
2.对方tcp协议栈以rst回复,代表对方主机已经重新启动(tcp/ip协议栈重启),应用进程会得到通知recv返回-1(telnetd程序使用这个功能退出自己并释放操作系统资源)
3.对方tcp协议栈不回复,会接着在一定时间内发送"探测分节",如果都没有相应,会在一定的时间后,应用进程会得到通知(如果得到通知,recv一般会返回-1)(telnetd程序使用这个功能退出自己并释放操作系统资源)
jwybobo2007 2008-03-31
  • 打赏
  • 举报
回复
用select那样判断的话不科学。KEEPALIVE选项要2小时才能检测出断开,也不方便使用。

其实自己做就行了,自己收发包做为检测断开的依据
supercow 2008-03-26
  • 打赏
  • 举报
回复
不用KEEPalive吧, 就定时的给客户端发点什么东西, 处理产生的错误就可以了.

下面是给SOCK设置个timeout 如果超时就当是客户端断掉了吧.


void SetTimeOut(SOCKET Socket,int nTimeOut)
{
int Result;
fd_set FdRead;
struct timeval TimeOut;
FD_ZERO(&FdRead);
FD_SET(Socket,&FdRead);
TimeOut.tv_sec = nTimeOut;
TimeOut.tv_usec = 0;
Result = select(Socket+1,&FdRead,NULL,NULL,&TimeOut);
if(Result == SOCKET_ERROR)
{
DBG("Fail To Create Time Out Thread \r\n");
closesocket(Socket);
}
else if(Result == 0)
{

DBG("Time Out Has Been Taking Place \r\n");
closesocket(Socket);
}
else DBG("OK To Create Time Out Thread \r\n");
}

Mr-Chen 2008-03-26
  • 打赏
  • 举报
回复
使用心跳包,可检测断线情况
未断线情况,程序状态可以通过自定义格式及在异常处理中发包的形式通知服务器端
scq2099yt 2008-03-26
  • 打赏
  • 举报
回复
ding
CathySun118 2008-03-25
  • 打赏
  • 举报
回复
心跳包可行,但它只能检测到对方是否正常,并不能知道是什么方式的异常
china_bai 2008-03-24
  • 打赏
  • 举报
回复
自己发心跳包,灵活,简单。好控制。

是最好的选择,而且也不麻烦。
mr.zhoux 2008-03-24
  • 打赏
  • 举报
回复
不要用keepalive,本来很简单的问题变得很复杂...最简单直接个询问制, 你问,我答,设置信号变量, 上次获得时间和本次获得时间超过 你认为范围了就认为断开了,
yebeans 2008-03-23
  • 打赏
  • 举报
回复
http://blog.csdn.net/jeven2005/archive/2007/12/11/1929268.aspx

还是自己程序发心跳吧,好控制。
lovejklife 2008-03-23
  • 打赏
  • 举报
回复
KEEPALIVE这个选项,只在server 端设置没有用吗?
好象这个选项检测的周期比较长

不行你就自己发包检测吧,呵呵
zhangystc 2008-03-23
  • 打赏
  • 举报
回复
自己顶!

18,356

社区成员

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

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