社区
网络编程
帖子详情
客户端用socket如何判断网络已经中断(如网线拔掉,与服务连接不上等等)?
z_yongqiang
2004-10-15 11:40:14
如题!
...全文
1148
20
打赏
收藏
客户端用socket如何判断网络已经中断(如网线拔掉,与服务连接不上等等)?
如题!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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: 中国制造
可以贴出来让我们学习学习吗?
【MFC】问题:
客户端
与
服务
器建立
连接
后,
拔掉
网线
的异常重连问题
【MFC】问题:
客户端
与
服务
器建立
连接
后,
拔掉
客户端
网线
,
客户端
无法重连?问题描述分析解决方法参考链接 问题描述 在项目开发的时候,需要实现异常断线重连的功能。在
客户端
和
服务
器端建立
连接
后,
拔掉
客户端
的
网线
,
客户端
这边能够正常返回错误,但是在
网络
恢复后,执行重连函数却无法再次
连接
上
服务
器。 分析 此处是我一开始执行的流程:在
客户端
连接
成功后,在recv()函数等待接收
服务
器端发来的消息。若此时
拔掉
网线
,recv()会返回错误,此时会在sleep(3000)后再次调用connec()函数,尝试与
服务
器
连接
。当
拔掉
网线
时
Socket
的检查方法
最近在做有关于TCP采集程序时,发现在
客户端
与
服务
器通过TCP
socket
进行通信的时候,如果
客户端
应用程序正常或者异常退出时,
服务
器都可以在对应的
socket
通信
连接
上获得响应(如返回0,或者抛出异常)。但是,如果在
客户端
的
网线
被
拔掉
的情况下,那么默认情况下,
服务
器端需要很长的时间才会知道
客户端
的
网线
断掉。对于许多
服务
器应用程序来说,这么长的反应时间是不能允许的,在这种情况下通常使用“心跳机...
TCP协议:
拔掉
网线
后, 原本的 TCP
连接
还存在吗?
客户端
拔掉
网线
后,并不会直接影响 TCP
连接
状态。所以,
拔掉
网线
后,TCP
连接
是否还会存在,关键要看
拔掉
网线
之后,有没有进行数据传输。有数据传输的情况:在
客户端
拔掉
网线
后,如果
服务
器端发送了数据报文段,那么在
服务
器端重传次数没有达到最大值之前,
客户端
就插回了
网线
,那么双方原本的 TCP
连接
还是能正常存在,就好像什么事情都没有发生。在
客户端
拔掉
网线
后,如果
服务
器端发送了数据报文段,在
客户端
插回
网线
之前,
服务
器端重传次数达到了最大值时,
服务
器端就会断开本次 TCP
连接
。
拔掉
网线
后TCP
连接
存活的真相与工程实践指南
TCP协议作为
网络
通信的核心基础,通过面向
连接
的机制保证数据传输的可靠性。其
连接
本质是由源IP、源端口、目标IP、目标端口四元组唯一标识的操作系统内核数据结构,而非简单的物理链路。当物理
网络
断开时,TCP
连接
并不会立即消失,而是通过Keepalive心跳机制、重传超时等策略维持存活状态,这一特性在分布式系统和微
服务
架构中具有重要技术价值。理解TCP
连接
在断网后的生命周期,有助于开发者在金融交易、实时通信等高可用场景中设计合理的容错机制。本文基于TCP重传和
连接
超时等热词,深入分析拔
网线
后
连接
存活的底层原理,
拔掉
网线
后, 原本的 TCP
连接
还存在吗?
????????关注后回复“进群”,拉你进程序员交流群????????作者丨小林coding来源丨小林coding(ID:CodingLin)大家好,我是小林。今天,聊一个有趣的问题:
拔掉
网线
几秒,再插回去...
网络编程
18,356
社区成员
64,161
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章