社区
通信技术
帖子详情
如何判断网络已断开?
乘思者
2005-12-28 05:37:04
我负责做一个网络组件,在应用层,使用C#编写的,同时有服务器与客户端。我现在有个问题一直搞的不是很明白,就是,如果我建立好了一个tcp连接,然后网络异常断开了,我的客户端和服务器如何知道这个事件?
...全文
833
29
打赏
收藏
如何判断网络已断开?
我负责做一个网络组件,在应用层,使用C#编写的,同时有服务器与客户端。我现在有个问题一直搞的不是很明白,就是,如果我建立好了一个tcp连接,然后网络异常断开了,我的客户端和服务器如何知道这个事件?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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 ...
网站
判断
网络
连接
断开
,js
判断
网络
连接
断开
,最佳实践
思路:js没有
判断
网络
断开
的直接方法,通用的方法效果不好(只要在局域网就会
判断
为连接,无法严格的
判断
是否连接互联网) 特殊方法,使用js获取一张图片(百度的logo)但不会显示它,
判断
是否获取成功;需要注意,一般...
经典的
判断
数据库连接
断开
或
网络
断开
问题
我们这里的软件遇到这个问题,解决的办法是,每次用数据库的时候都把connection和query打开一次,同时在界面上留有panel来提示
网络
断开
还是数据库
断开
(下面两个函数是我们用来
判断
网络
断开
还是数据库
断开
的函数): ...
C#中 怎么检测Tcp网线
断开
?
在 C# 中,如果使用 TcpClient 或 TcpListener 这样的套接字进行通信,并且
网络
连接
断开
,不发送心跳是无法立即检测到
断开
的。当使用 TCP 进行通信时,通常是通过发送和接收数据来维持连接的活跃状态。如果没有数据...
python如何
判断
tcp异常
断开
_如何
判断
TCP连接已经中断?
用Python写
网络
应用是很常见的,因此一个常见的问题就是,如何在Python代码中
判断
TCP链接已经中断?TCP有连接,如果通讯的某一方中断的连接,另外一方在socket层面如何感知?这个问题我也是经过一番挣扎才搞清楚的。...
通信技术
4,387
社区成员
28,918
社区内容
发帖
与我相关
我的任务
通信技术
通信技术相关讨论
复制链接
扫一扫
分享
社区描述
通信技术相关讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章