使用心跳包判断客户端断开与否

night110 2009-08-25 03:44:20
rt,
客户端每隔30秒给服务器端发送一个心跳包,2分钟后,如果服务器端没有接收到该客户端的心跳包,则视其已断开连接,
请问服务器端怎么去实现这个2分钟后的检查?服务器怎么知道客户连接了多长,程序里怎么知道是否已经2分钟?

我的开发语言是C,并使用windows API
...全文
447 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
shenyi0106 2009-08-26
  • 打赏
  • 举报
回复
http://download.csdn.net/source/1488081
secretcf 2009-08-26
  • 打赏
  • 举报
回复
可以的。
qiangorqiang 2009-08-26
  • 打赏
  • 举报
回复
关注
night110 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 secretcf 的回复:]
你开个线程专门用来检查超时问题.
DWORD WINAPI Thread_Check(void* pVoid)
{
    int i = 0;

    while(!g_bStop)
    {
        Sleep(1);
        time_t tCurrent = time(NULL);
        EnterCriticalSection(...);

        int nCount = m_caClient.GetSize();//或者用vector遍历
        for(i = 0; i <nCount; i++)
        {
            CLIENT *p = m_caClient.GetAt(i);
            if(tCurrent - p->tLastReceive > 120)
            {
                closesocket(p->socket);
            }
        }

        LeaveCriticalSection(...);
    }
}
[/Quote]

太感谢了,使用timeSetEvent()函数,把检查逻辑放在回调函数上,这样就能实现定时地去检查,这能行吧?
secretcf 2009-08-26
  • 打赏
  • 举报
回复
你开个线程专门用来检查超时问题.
DWORD WINAPI Thread_Check(void* pVoid)
{
int i = 0;

while(!g_bStop)
{
Sleep(1);
time_t tCurrent = time(NULL);
EnterCriticalSection(...);

int nCount = m_caClient.GetSize();//或者用vector遍历
for(i = 0; i<nCount; i++)
{
CLIENT *p = m_caClient.GetAt(i);
if(tCurrent - p->tLastReceive > 120)
{
closesocket(p->socket);
}
}

LeaveCriticalSection(...);
}
}
night110 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 secretcf 的回复:]
1万个客户端!!!
估计以你现在的水平做不了。
高性能服务器的话,需要用IOCP. 网上去查查资料吧。
[/Quote]

已经使用IOCP了,做不了就要学着做,在理论学习中实践,在实践中回顾理论。
secretcf 2009-08-26
  • 打赏
  • 举报
回复
1万个客户端!!!
估计以你现在的水平做不了。
高性能服务器的话,需要用IOCP. 网上去查查资料吧。
night110 2009-08-26
  • 打赏
  • 举报
回复
综合各位的指导,我想是不是可以这样:
创建一个客户列表,将每个连接的客户加入到列表中,列表中记录客户发送的最后一个心跳包的时间,然后起一个定时器,定时地检查当前时间与客户列表记录的心跳包时间,如果超时,视其断开。

但现在又有几个问题,
1、在c里如何设计定时器去定时地检查,在windows下有现成可利用的吗?
2、客户端最多有一万个,如果每次都这样定时地去检查,是不是不降低服务器性能,采用什么方法可以提高效率呢?
secretcf 2009-08-26
  • 打赏
  • 举报
回复
开个线程,专门检查。
night110 2009-08-26
  • 打赏
  • 举报
回复
还有个问题,要如何定时地遍历客户列表呢?
这个定时怎么做到?
night110 2009-08-25
  • 打赏
  • 举报
回复
楼上各位说得都很有道理,能否说得更具体点,后者举个例子来看看
雪影 2009-08-25
  • 打赏
  • 举报
回复
ls以及给出了数据结构,
你按着这种方式,定时偏历你的客户列表.如果最后时间超过两分钟就认为客户断开了连接.
secretcf 2009-08-25
  • 打赏
  • 举报
回复
对于每个客户连接,建立一个CLIENT对象,该对象大致可以是这样:
typedef struct _sClient
{
TCHAR tstrIP[32];
DWORD dwTcpPort;
time_t tConnect;
time_t tDisconnect;
time_t tLastReceive;
time_t tLastSend;
}CLIENT;
并维护每个CLIENT对象。
night110 2009-08-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 tttyd 的回复:]
应该是服务器要维护一组数组吧,用于记录客户端信息以及最后一次发心跳包的时间
[/Quote]

我用的是完成端口模型,照你的意思是,在结构中记录客户端信息和最后一次发心跳包时间?
即使这样,又该如何去计时,以便在两分钟后就检查而做出判断呢?
ziplj 2009-08-25
  • 打赏
  • 举报
回复
方法仅供参考 1L的很对 应该要维护一个时间数据结构
ziplj 2009-08-25
  • 打赏
  • 举报
回复
可以使用定时器 定时两分钟
然后在受到心跳包的时候 重置定时器
雪影 2009-08-25
  • 打赏
  • 举报
回复
应该是服务器要维护一组数组吧,用于记录客户端信息以及最后一次发心跳包的时间

18,356

社区成员

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

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