客户端用socket如何判断网络已经中断(如网线拔掉,与服务连接不上等等)?

z_yongqiang 2004-10-15 11:40:14
如题!
...全文
1145 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
yiurchao 2004-11-30
  • 打赏
  • 举报
回复
我也有同样的问题,比如服务器端程序突然死掉了,或者是其他原因以外中断后怎么让客户机知道连接失去了?
QQ的掉线又是怎么一个机制呢?
QQ怎么知道自己没有和TENCENT服务器断开了?

没有用过什么心跳机制,和发送请求信号,得不到回应就判断失去连接这种方法有什么区别呢?
atfyi 2004-11-30
  • 打赏
  • 举报
回复
只能使用心跳机制了吧.简单的说就是个一小段时间和服务器交互一次来实现双方"活着"的证据
DentistryDoctor 2004-11-29
  • 打赏
  • 举报
回复
FD_CLOSE?应该可以检测到的。
qq_13939330 2004-10-20
  • 打赏
  • 举报
回复
客户端向服务端发送信息,在有限的时间内,没有收到服务端发回的应答,则视为网络中端;当然你也可以改为:当连续多少次没有收到服务端发回的应答,则视为网络中断!
joinrry 2004-10-18
  • 打赏
  • 举报
回复
1、程序断开用CSocket::OnClose?FD_CLOSE?检测
2、硬件断开用数据包检测机制,具体就是定义一个请求包和一个响应包,定时发送,如果服务器端超时未能收到客户端响应包,则为网络断开
toxyboy 2004-10-18
  • 打赏
  • 举报
回复
楼上的经过实践的做法值得效仿!重在参与阿!!!
PiggyXP 2004-10-18
  • 打赏
  • 举报
回复
55555,又看到 joinrry(骑着小猪去流浪)了...T_T

单单响应 FD_CLOSE 消息是不能满足楼主的要求的,应为在对方网络非正常断开,比如拔掉网线之类的是不会触发这个消息的

所以解决的方法就是 gdy119(中国制造)那样的发送心跳包的办法是最好的解决方案
simahuapeng 2004-10-18
  • 打赏
  • 举报
回复
TCP协议自己支持心跳

struct tcp_keepalive ka;
struct tcp_keepalive outka;
DWORD insize= 0;
DWORD outsize=0;
DWORD bytesout=0;

ka.onoff=1;
ka.keepalivetime=6*1000; //6秒
ka.keepaliveinterval=1000; //1秒

int ret=::WSAIoctl(socket, SIO_KEEPALIVE_VALS,
&ka, sizeof(struct tcp_keepalive),
&outka, sizeof(struct tcp_keepalive),
&bytesout, NULL, NULL );



注意:在98下面不支持
gjd111686 2004-10-18
  • 打赏
  • 举报
回复
一般OnClose足够了.
jiudon 2004-10-18
  • 打赏
  • 举报
回复
严重同意楼上的,就是现在流行的“心跳包”啊!(骑着小猪去流浪) 名字好怪异?!!^_^
clovexmu 2004-10-18
  • 打赏
  • 举报
回复
同意心跳包的方法。
不过如果对网络中断的反应时间不是要求很高的话,其实是可以等待Socket类触发FD_CLOSE 消息的。(我用的是异步Socket)。我自己试过了,不管是拔网线,禁止网卡,软件屏蔽,只要网络中断,就一定回触发FD_CLOSE 消息。不过要等30s至60s的时间,呵呵。
longki 2004-10-15
  • 打赏
  • 举报
回复

客户端向服务端发送信息,在有限的时间内,没有收到服务端发回的应答,则视为网络中端;当然你也可以改为:当连续多少次没有收到服务端发回的应答,则视为网络中断!
gdy119 2004-10-15
  • 打赏
  • 举报
回复
我以前也处理过这种情况:
我的做法是,client在OnIdle()的时候,也就是没有网络事件发生的时候 ,
client会发送一个数据报(主要是验证设备状态),server会返回这个数据包,
如果数据包没有错误,说明网络状况良好;否则说明网线端开;
当然你在等网络事件发生的时候一定要设置个演说延时!
simahuapeng 2004-10-15
  • 打赏
  • 举报
回复
时间会很长
DentistryDoctor 2004-10-15
  • 打赏
  • 举报
回复
CSocket::OnClose?FD_CLOSE?
CsLover 2004-10-15
  • 打赏
  • 举报
回复
捕捉返回的错误号
不过好像没有哪个错误号说明是硬件上的断开吧 最多也就地址解析失败啊什么的
你这个要求过分了 嘿嘿
gdy119 2004-10-15
  • 打赏
  • 举报
回复
to :
Hotthing(豪星)
不知道你用的是哪种模型,或者用的是MFC的类?
oyljerry 2004-10-15
  • 打赏
  • 举报
回复
接收onclose事件,或发心跳包监测
nwpulipeng 2004-10-15
  • 打赏
  • 举报
回复
超时不行吗??
Hotthing 2004-10-15
  • 打赏
  • 举报
回复
To: 中国制造

可以贴出来让我们学习学习吗?

18,356

社区成员

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

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