怎样判断客户端掉线了

awjx 2014-11-18 11:37:45
linux发送缓冲区最小2048(win下我还没查),也就是说无法关闭发送缓冲区,这样的话,如果设计的心跳只是判断发送,而不判断接收,那根本起不到自检的作用

而别人的服务器也不提供心跳应答包,那我做为客户端,怎样判断非正常掉线了?

如果发送缓冲区可设为0,那send一次就能判断,现在最小是2048,意味着我要发这么多才能知道掉线了?

这种情况,该怎样判断客户端掉线了?困扰我几天了!
...全文
1599 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
  System.Net.NetworkInformation.Ping p = new System.Net.NetworkInformation.Ping();
            System.Net.NetworkInformation.PingOptions options = new System.Net.NetworkInformation.PingOptions();
            options.DontFragment = true;
            string data = "Test Data!";
            byte[] buffer = Encoding.ASCII.GetBytes(data);
            int timeout = 1000; // Timeout 时间,单位:毫秒
            System.Net.NetworkInformation.PingReply reply = p.Send(ip, timeout, buffer, options);
            if (reply.Status == System.Net.NetworkInformation.IPStatus.Success)
                return true;
            else
                return false;
clever101 2016-10-10
  • 打赏
  • 举报
回复
请问各位大侠,是设置一个时钟时间每隔一段时间就发送一个心跳包吗?
foxavideo 2015-03-06
  • 打赏
  • 举报
回复
如果对方服务器没有心跳包的支持,那么你只能利用发icmp包来检测了,创建一个原始套接字(不是tcp也不是udp) 更多信息请参看: http://www.itye.org/archives/1282
worldy 2015-02-10
  • 打赏
  • 举报
回复
客户端应该依赖超时检测吧,发数据--超过时间没有返回--判断为断线
worldy 2015-02-10
  • 打赏
  • 举报
回复
客户端应该依赖超时检测吧,发送数据,超过时间没有返回,则判断断线
baoyz 2015-02-10
  • 打赏
  • 举报
回复
引用 3 楼 lgstudyvc 的回复:
ping吧 按照你认为掉线的时长
也就这样了。
awjx 2014-12-10
  • 打赏
  • 举报
回复
这么多热心的人回答,还真是一人看懂了我的问题,哎!
  • 打赏
  • 举报
回复
看客户端是否能返回信息给服务器
awjx 2014-12-09
  • 打赏
  • 举报
回复
引用 17 楼 wangningyu 的回复:
如果设计的心跳只是判断发送,而不判断接收 心跳包发送和接收意义不大,最主要的是接收到客户端最后心跳包时间 判断上一次接收的时间,比如正常是30秒/包,你把最后一次发送的时间保存起来(取服务端时间) 每隔一分钟遍历一次链表,如果超过40秒则认为断线
我的问题是客户端判断自已是否掉线,不是服务器判断客户端是否掉线。
awjx 2014-12-09
  • 打赏
  • 举报
回复
引用 17 楼 wangningyu 的回复:
如果设计的心跳只是判断发送,而不判断接收 心跳包发送和接收意义不大,最主要的是接收到客户端最后心跳包时间 判断上一次接收的时间,比如正常是30秒/包,你把最后一次发送的时间保存起来(取服务端时间) 每隔一分钟遍历一次链表,如果超过40秒则认为断线
多的问题是客户端判断自已是否掉线,不是服务器判断客户端是否掉线。
笨笨仔 2014-12-09
  • 打赏
  • 举报
回复
WIN下使用套接字方式时,网络断开的返回时间在不同的状态也会不同。 1、当本机网线断开时,客户端会立即收到OnClose事件 2、当网络正常连接在交换机上,而服务端异常断开,OnClose事件会延迟发生 正常断开,nErrorCode 返回0,非正常断开时,返回一个错误代码-1。 TCP在连接建立后底层有一个“心跳”,如果你直接监视TCP的心跳包,可能知道与服务端的连接状态,但可能涉及到低级编程我也未做过。
汪宁宇 2014-11-29
  • 打赏
  • 举报
回复
如果设计的心跳只是判断发送,而不判断接收 心跳包发送和接收意义不大,最主要的是接收到客户端最后心跳包时间 判断上一次接收的时间,比如正常是30秒/包,你把最后一次发送的时间保存起来(取服务端时间) 每隔一分钟遍历一次链表,如果超过40秒则认为断线
无聊的影子 2014-11-29
  • 打赏
  • 举报
回复
我也碰到同样的问题求教
Squall_zy 2014-11-27
  • 打赏
  • 举报
回复
tcp是无状态的协议,若想知道连接状态,必须自己想办法。(如心跳包) 在一条TCP连接中,心跳包通常是单向的。双方还要定好心跳周期。 对于发送方,如果心跳发不出去,说明连接断了; 对于接收方,如果在一个周期(通常大于一个周期)内还没收到心跳,说明连接断了;
  • 打赏
  • 举报
回复
recv不返回是阻塞了,linux都是阻塞模式吗?linux我不熟。windows是可以设置的。
Marcelxx 2014-11-27
  • 打赏
  • 举报
回复
发送心跳包看看能不能在指定时间收到回复,可以使用几个MSL来判断。
「已注销」 2014-11-25
  • 打赏
  • 举报
回复
网络这种东西,靠什么“底层api”? 只有beep包检测,是唯一可靠的办法。
jianghandaxue 2014-11-25
  • 打赏
  • 举报
回复
引用 8 楼 awjx 的回复:
[quote=引用 5 楼 SiGoYi 的回复:] 楼主已经知道心跳处理机制了,已经说了是别人的服务器不提供心跳包的回复,楼上的根本不仔细看楼主的问题啊。 好长时间不做socket了,我记得recv函数好像是在断开时会返回“-1”吧!楼主可以式式,一般来说都是使用一个接收线程循环的调用recv函数,等待连接方send时发送数据。楼主可以式一下,我记得好像是有这么回事,当断开了recv直接返回“-1”或你看看会不会有传回,应该就会结束当次的阻塞。
谢谢你认真看了我的问题! 你说socket断开时recv返回-1,在win下是这样的,我也是那么处理,很可靠。 但是linux下不管用了,也就是说非正断开连接后,recv不返回! [/quote] 跟开发服务器方协商一些,定制心跳包检测机制
awjx 2014-11-24
  • 打赏
  • 举报
回复
引用 5 楼 SiGoYi 的回复:
楼主已经知道心跳处理机制了,已经说了是别人的服务器不提供心跳包的回复,楼上的根本不仔细看楼主的问题啊。 好长时间不做socket了,我记得recv函数好像是在断开时会返回“-1”吧!楼主可以式式,一般来说都是使用一个接收线程循环的调用recv函数,等待连接方send时发送数据。楼主可以式一下,我记得好像是有这么回事,当断开了recv直接返回“-1”或你看看会不会有传回,应该就会结束当次的阻塞。
谢谢你认真看了我的问题! 你说socket断开时recv返回-1,在win下是这样的,我也是那么处理,很可靠。 但是linux下不管用了,也就是说非正断开连接后,recv不返回!
bluesen 2014-11-24
  • 打赏
  • 举报
回复
心跳也快不到哪里去。似乎应该用更底层的api
加载更多回复(7)

18,356

社区成员

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

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