社区
通信技术
帖子详情
如何判断网络已断开?
乘思者
2005-12-28 05:37:04
我负责做一个网络组件,在应用层,使用C#编写的,同时有服务器与客户端。我现在有个问题一直搞的不是很明白,就是,如果我建立好了一个tcp连接,然后网络异常断开了,我的客户端和服务器如何知道这个事件?
...全文
848
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)
网络
状态系列:Android 如何
判断
当前
网络
是否
断开
?
发送
网络
请求之前,需要先检测
网络
状态,如果
网络
断开
,则给提示。 public class NetworkUtils { public static boolean isNetworkAvailable(Context context) { if (context != null) { ConnectivityManager ...
Netty 连接存活检测——如何
判断
连接是否
断开
?
前言 最近碰到了一个需求,需要
判断
客户端与服务端之间的连接是否已经
断开
,查阅资料后发现Netty提供了如下几种方式,现总结如下,方便后续查看。 二.存活检测方式 2.1 SO_KEEPALIVE选项 Netty提供了SO_KEEPALIVE...
网站
判断
网络
连接
断开
,js
判断
网络
连接
断开
,最佳实践
思路:js没有
判断
网络
断开
的直接方法,通用的方法效果不好(只要在局域网就会
判断
为连接,无法严格的
判断
是否连接互联网) 特殊方法,使用js获取一张图片(百度的logo)但不会显示它,
判断
是否获取成功;需要注意,一般...
经典的
判断
数据库连接
断开
或
网络
断开
问题
我们这里的软件遇到这个问题,解决的办法是,每次用数据库的时候都把connection和query打开一次,同时在界面上留有panel来提示
网络
断开
还是数据库
断开
(下面两个函数是我们用来
判断
网络
断开
还是数据库
断开
的函数): ...
C#中 怎么检测Tcp网线
断开
?
在 C# 中,如果使用 TcpClient 或 TcpListener 这样的套接字进行通信,并且
网络
连接
断开
,不发送心跳是无法立即检测到
断开
的。当使用 TCP 进行通信时,通常是通过发送和接收数据来维持连接的活跃状态。如果没有数据...
通信技术
4,390
社区成员
28,906
社区内容
发帖
与我相关
我的任务
通信技术
通信技术相关讨论
复制链接
扫一扫
分享
社区描述
通信技术相关讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章