社区
网络编程
帖子详情
使用心跳包判断客户端断开与否
night110
2009-08-25 03:44:20
rt,
客户端每隔30秒给服务器端发送一个心跳包,2分钟后,如果服务器端没有接收到该客户端的心跳包,则视其已断开连接,
请问服务器端怎么去实现这个2分钟后的检查?服务器怎么知道客户连接了多长,程序里怎么知道是否已经2分钟?
我的开发语言是C,并使用windows API
...全文
447
17
打赏
收藏
使用心跳包判断客户端断开与否
rt, 客户端每隔30秒给服务器端发送一个心跳包,2分钟后,如果服务器端没有接收到该客户端的心跳包,则视其已断开连接, 请问服务器端怎么去实现这个2分钟后的检查?服务器怎么知道客户连接了多长,程序里怎么知道是否已经2分钟? 我的开发语言是C,并使用windows API
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
应该是服务器要维护一组数组吧,用于记录客户端信息以及最后一次发心跳包的时间
WebSocket整合SpringBoot、SockJS、Stomp、Rabbitmq分布式消息推送
(1)HTML5 WebSocket、异常重连、心跳检测; (2)SockJS、Stomp、RabbitMQ Stomp消息代理; (3)分别用Nginx和Spring Cloud Gateway实现多实例负载均衡; (4)可靠消息推送(Stomp持久化队列、
客户端
ACK确认机制...
tcp 服务端如何
判断
客户端
断开
连接
我在server端会
使用
专门的线程处理一条socket连接。这就涉及到一个问题,如果socket连接
断开
(异常,正常)后,我如何才能感知到?server端这边是绝对被动的,sever端不能主动
断开
连接。也没有连接链路维持包之类的...
python如何
判断
tcp异常
断开
_tcp 服务端如何
判断
客户端
断开
连接
我在server端会
使用
专门的线程处理一条socket连接。这就涉及到一个问题,如果socket连接
断开
(异常,正常)后,我如何才能感知到?server端这边是绝对被动的,sever端不能主动
断开
连接。也没有连接链路维持包之类的。...
【VS开发】TCP服务端如何
判断
客户端
断开
连接
一篇文章: ...最近在做一个服务器端程序,C/S结构。功能方面比较简单就是client端与server端建立连接,然后发送消息给server。...这就涉及到一个问题,如果socket连接
断开
(异常,正常)后,我如何才能感知到?
linux tcp服务端检测链路
断开
,tcp 服务端如何
判断
客户端
断开
连接
1.C/S结构。功能方面比较简单就是client端与server端建立连接...也没有连接链路维持包之类的。client端发送数据的时间也是不定的。在socket连接
断开
后, server要能够感知到并释放资源。方案1:当
使用
select()函数...
网络编程
18,356
社区成员
64,214
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章