如何判断网络已断开?

乘思者 2005-12-28 05:37:04
我负责做一个网络组件,在应用层,使用C#编写的,同时有服务器与客户端。我现在有个问题一直搞的不是很明白,就是,如果我建立好了一个tcp连接,然后网络异常断开了,我的客户端和服务器如何知道这个事件?
...全文
817 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
awjx 2006-04-24
  • 打赏
  • 举报
回复
如果异常断开了,send返回的不是期待的长度!
乘思者 2006-04-20
  • 打赏
  • 举报
回复
谢谢楼上,不过我的意思是tcp/ip连接断开(好比,网络一端异常退出),这时候另外一端如何立即有效的收到这个消息。
alwaysakid 2006-03-07
  • 打赏
  • 举报
回复
网络断开和心跳是两个概念
可以监控网卡地址变化,当网线拔掉,会得到通知
fierygnu 2006-02-23
  • 打赏
  • 举报
回复
干脆用SCTP吧,协议自身就支持心跳。
乘思者 2006-02-23
  • 打赏
  • 举报
回复
谢谢大家。
因为我用dotNet封装好的类,屏蔽了底层,
现在看还是不行,还是用Sockte类算了。
fierygnu 2006-02-23
  • 打赏
  • 举报
回复
http://www.ietf.org/rfc/rfc2960.txt
乘思者 2006-02-23
  • 打赏
  • 举报
回复
这个是什么协议?有相关的资料吗?
ablewindy 2006-01-25
  • 打赏
  • 举报
回复
你开个线程接收,当网络断开,recv是会返回一个特定的失败错误,是吗?
要是的话,这样就知道了!
不知道对不对?请教各位了!
fct0906 2006-01-06
  • 打赏
  • 举报
回复
一般都是加一个自定义的探测包,可以理解为自定义的ping包,对方在收到自定义的ping包后必须返回一个应答。在设定的时间或者发出设定的次数个ping包后还收不到回复可认为网络已经断开。
这种在网络中断,如网线断了什么的情况下可以判断出来,如果对方进程异常终止,操作系统会主动断开tcp连接,通过发送一个RST包。而TCP的正常终止是FIN包。
hswxf 2006-01-06
  • 打赏
  • 举报
回复
楼上应该加一个问题:
如果是流控的话,应该考虑没有ACK(也就是你说的心跳是三个的问题),是可能再发送的,这时应该是TCP自己的WAIT_TIME停止响应了,呵呵!一般是2倍,如900秒等;
netsys2 2006-01-06
  • 打赏
  • 举报
回复
我一开始就说了,现在仍然不变:

这个问题很早前就讨论过了,因为网络异常的缘故,连接中断的拆线IP包可能对方没有收到。

因此为了保证传输质量,一般采用下面的方法:

1)心跳检查:一方定时发送心跳信号给对方,对方收到后把序列号加1返回,如果在一定的时间内没有收到响应包,尝试再发一次,三次后仍然没有返回,则认为线路已断,双方都把SOCKET->Close();

2)定时巡查:对SERVER端,如果在一定的时间(如1小时,1天,根据你的应用来判断)都没有收到任何数据,则认为线路已断,SOCKET->Close();

发送数据时必须检查SOCKET有效性并处理SOCKET错误!

可以结题了。
zhousqy 2006-01-06
  • 打赏
  • 举报
回复
timeout
herryhuang 2006-01-01
  • 打赏
  • 举报
回复
yes
乘思者 2005-12-31
  • 打赏
  • 举报
回复
我现在理解一点了,其实连接是存在于两端的二不是网络中的。
如果一端突然消失,另一端如果没有什么操作(即不主动探知对端是否存在),是不可能知道的。
不知道我理解的对否。
netsys2 2005-12-31
  • 打赏
  • 举报
回复
因为网络异常的缘故,连接中断的拆线IP包可能对方没有收到。
乘思者 2005-12-31
  • 打赏
  • 举报
回复
...如果2个小时(别叫,RFC就是这么写的)...

我要叫~~~~~~
谢谢,原理我知道了,那在它认为断开的时候我如何收到通知?我只要知道这个就可以了。
herryhuang 2005-12-30
  • 打赏
  • 举报
回复
TCP有个“保活定时器”,如果2个小时(别叫,RFC就是这么写的)没有数据传送,会给对端发送一份报文,使用的序列号是曾经发出的最后一个报文的最后一个字节的序列号,对端如果收到这个数据,回送一个TCP的ACK,确认这个字节已经收到,这样就知道对端还“活着”了。

保活定时器启动探测后,如果一段时间没有收到对方的响应,会进行重试,重试几次后,向对端发一个reset,然后将连接断掉。

保活定时器是比较有争议的一个标准,因此属于“可选实现”,可能不是所有的系统都实现了,或者可能可以用socket的选项来设置。

如果你的应用确实需要比较实时的知道对端是否还在,那就只能自己实现,可以参考telnet协议中的这部分。
乘思者 2005-12-30
  • 打赏
  • 举报
回复
关键问题就在这,我怎么知道通讯异常了呢?
cai3995 2005-12-29
  • 打赏
  • 举报
回复
不是,如果在网络超时范围以内的时间断开,我还可以发送数据,但是只是不会收到数据了而已,难道出现这种情况,我一直要等到它超时才能认为连接已断开?
-----------------------------------------------
setsockopt() can set the no wait
netsys2 2005-12-29
  • 打赏
  • 举报
回复
这个问题很早前就讨论过了,因为网络异常的缘故,连接中断的拆线IP包可能对方没有收到。

因此为了保证传输质量,一般采用下面的方法:

1)心跳检查:一方定时发送心跳信号给对方,对方收到后把序列号加1返回,如果在一定的时间内没有收到响应包,尝试再发一次,三次后仍然没有返回,则认为线路已断,双方都把SOCKET->Close();

2)定时巡查:对SERVER端,如果在一定的时间(如1小时,1天,根据你的应用来判断)都没有收到任何数据,则认为线路已断,SOCKET->Close();

发送数据时必须检查SOCKET有效性并处理SOCKET错误!

可以结题了。
加载更多回复(9)
课程以技术人的网络知识为中心和基线,通过基础理论篇、进阶拓展篇和实践练习篇三个部分的分解与层层递进,全面覆盖OSI七层模型与封装和解封装等网络通信核心思想、TCP协议、TCP三次握手与四次挥手过程原理、time-wait状态及连接过多处理等经典网络硬核基础知识,互联网、云计算与云原生时代下CDN、容器集群网络通信原理等进阶延伸知识,和以读懂/绘制拓扑图、网络诊断与调试命令、生产环境典型的网络故障处理、基于Wireshark和tcpdump进行常见环境尤其是容器环境(包括Docker和Kubernetes容器集群)下报文抓取及分析和分步法来分析并排除故障为代表的实践性知识。 课程大纲如下:课程的设计摒弃过于细分的网工专属的CCNA/CCNP等受众面小的路线,以互联网业界典型的技术岗对网络知识的共性需求为主线,理论联系实际,实践演示反哺验证理论,以突出实用性和可实践性为特色,让以往抽象、空洞的网络知识以接地气、看得见、能实际感知观测的方式来传授讲解,有图有真相,有作业有练习,有引导思考和相应解答,有模型有实践演示,还有众多生活中鲜活的举例。确保稍微具备一点基础背景的同学,都能听得懂、学得会、用得上,切实提升大多数技术岗(开发人员、测试人员、运维人员、架构师、解决方案架构师、售前顾问、技术支持工程师、技术客服人员等)的职场竞争力和个人影响力。 除了讲授知识模块本身,还有底层思想的剖析讲解和思维层面的发散引导,以帮助同学们构筑基础知识框架体系和技术性思维。课程同时融入微服务、CDN、TCP协议及通信原理、云原生与容器集群等互联网界刚需前沿性知识模块,并穿插进部分互联网界技术岗高频基础面试题及解答,以及典型的生产环境网络故障处理举例和少有地方讲解清楚的部分技术疑点和误区(如容器网络flannel的host-gw模式下节点是否必须在同一个二层网络,容器网络Calico中blackhole路由的作用,Calico中IP分配机制是否存在不足等),以最大程度上覆盖满足主要技术岗位对网络及其相关延伸知识的技能需求,确保同学们的学习能紧跟工作实际和主流技术趋势,学有所成、学有所值,并实实在在增加职场筹码。 学习本课程,可有效支撑同学们在物理机、虚拟机、云计算、容器集群、Server-less等不同基础设施环境下,以及单体架构、分布式架构、SOA架构、微服务架构、云原生架构等不同应用架构下,对底层网络基础及相关知识的实际需求运用。

4,358

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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