如何判断网络已断开?

乘思者 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错误!

可以结题了。
  • 打赏
  • 举报
回复
加载更多回复
发帖
通信技术
加入

4255

社区成员

通信技术相关讨论
社区管理员
  • 网络通信
申请成为版主
帖子事件
创建了帖子
2005-12-28 05:37
社区公告
暂无公告