社区
通信技术
帖子详情
如何判断网络已断开?
乘思者
2005-12-28 05:37:04
我负责做一个网络组件,在应用层,使用C#编写的,同时有服务器与客户端。我现在有个问题一直搞的不是很明白,就是,如果我建立好了一个tcp连接,然后网络异常断开了,我的客户端和服务器如何知道这个事件?
...全文
744
29
打赏
收藏
微信扫一扫
点击复制链接
分享
下载分享明细
分享
举报
写回复
29 条
回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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错误!
可以结题了。
打赏
举报
回复
赞
加载更多回复
相关推荐
Socket
判断
远端
网络
是否
断开
,简单例子
Socket
判断
远端
网络
是否
断开
,简单例子。
Socket
判断
网络
断开
在简书上的原创,欢迎移步
服务器端怎么
判断
客户端
已
断开
连接
服务器端怎么
判断
客户端
已
断开
连接 检测连接是否丢失的方法大致有两种:keepalive和heart-beat。 (tcp内部机制)采用keepalive,它会先要求此连接一定时间没有活动(一般是几个小时),然后发出数据段,经过多...
java
判断
socket_java
判断
socket是否
断开
的方法
socket类中有一个方法sendUrgentData,它会往输出流发送一个字节的数据,只要对方Socket的SO_OOBINLINE属性没有打开,...java
判断
远端是否
断开
了连接:try{socket.sendUrgentData(0xFF);}catch(Exception ex){reconn...
c#中如何探测
网络
连接是否
断开
?
最近遇到一个问题,linux 的client端改变IP地址后再次连接Windows server端, server不会得到任何连接关闭的通知,用命令: netstat -anop tcp | find "4114" ,发现连接依然是established状态: C:\Documents and ...
发帖
通信技术
加入
微信扫一扫
点击复制链接
分享社区
下载分享明细
4255
社区成员
2.8w+
社区内容
通信技术相关讨论
社区管理员
申请成为版主
帖子事件
创建了帖子
2005-12-28 05:37
社区公告
暂无公告