社区
通信技术
帖子详情
如何判断网络已断开?
乘思者
2005-12-28 05:37:04
我负责做一个网络组件,在应用层,使用C#编写的,同时有服务器与客户端。我现在有个问题一直搞的不是很明白,就是,如果我建立好了一个tcp连接,然后网络异常断开了,我的客户端和服务器如何知道这个事件?
...全文
817
29
打赏
收藏
如何判断网络已断开?
我负责做一个网络组件,在应用层,使用C#编写的,同时有服务器与客户端。我现在有个问题一直搞的不是很明白,就是,如果我建立好了一个tcp连接,然后网络异常断开了,我的客户端和服务器如何知道这个事件?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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架构、微服务架构、云原生架构等不同应用架构下,对底层
网络
基础及相关知识的实际需求运用。
网站
判断
网络
连接
断开
,js
判断
网络
连接
断开
,最佳实践
思路:js没有
判断
网络
断开
的直接方法,通用的方法效果不好(只要在局域网就会
判断
为连接,无法严格的
判断
是否连接互联网) 特殊方法,使用js获取一张图片(百度的logo)但不会显示它,
判断
是否获取成功;需要注意,一般浏览器都会有缓存(文件名相同的资源不会重复加载),所以采取措施;图片文件后添加参数(由时间生成),让浏览器认为不是同一张图片。 话不多说,上代码 window.onload = function () { //网页加载完成便运行 var nextValue = true; //用于决定是否下
经典的
判断
数据库连接
断开
或
网络
断开
问题
我们这里的软件遇到这个问题,解决的办法是,每次用数据库的时候都把connection和query打开一次,同时在界面上留有panel来提示
网络
断开
还是数据库
断开
(下面两个函数是我们用来
判断
网络
断开
还是数据库
断开
的函数): function CheckNetConnection(IP: string): Boolean; var Echo: TIdEcho; begin Echo
C#中 怎么检测Tcp网线
断开
?
在 C# 中,如果使用 TcpClient 或 TcpListener 这样的套接字进行通信,并且
网络
连接
断开
,不发送心跳是无法立即检测到
断开
的。当使用 TCP 进行通信时,通常是通过发送和接收数据来维持连接的活跃状态。如果没有数据传输,并且不发送心跳包,那么时间一过,连接就会被认为是空闲的,而不管实际上该连接是否仍然存在。这样,操作系统将自动发送心跳包,以检测连接的活跃性。当使用 C# 进行 TCP 连接时,下面是一些示例代码,演示如何使用各种方法来检测连接是否
断开
。
C#
判断
网络
是否
断开
首先引入命名空间: using System.Runtime.InteropServices; 再定义如下: [DllImport("wininet.dll")] private e...
通信技术
4,358
社区成员
28,927
社区内容
发帖
与我相关
我的任务
通信技术
通信技术相关讨论
复制链接
扫一扫
分享
社区描述
通信技术相关讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章