[VxWorks] 如何解决VxWorks情况下的tcp连接异常快速处理方法,包括客户端死机,reset重起,网线拔掉,对端掉电

tyutlx   2009-5-6 17:46 楼主
tcp连接模型如下(C语言)
场景:A与B是vxWorks下的两主机,需要建立一条TCP连接.(A,B任一方为client或server);
产生这个原因是因为tcp是一个单向的处理通道,也就是A到B数据量很大,B到A的数据量很小;没有设计心跳和握手.产品已成型,更改设计涉及面广,顺便说一句这个设计很不到位,需要一个开销最小的修改.


过程如下:
1.A连接B成功
2.B重启或拔板(vxWorks)
3.在B重启之后A无任何数据包到B;
4.B重启成功后,其服务端口正常打开;但与A无任可相关性,A可通过新端口与之建立连接.因旧连接一直保活没有处理.
5.在A的主机上通过inetstatShow还能看到以前的tcp连接为建立状态.
也就是目前A到B存在一个假的空闲连接要干掉.也就是一个单向的数据通道,任何心跳机制能处理这种异常;如果和第三方对接没有心跳,只能等协议栈超时(keep alive =2小时)删除.

仔细想想细节,有什么好的办法没有?
目前有如下解决办法,有其它的办法没有?
1.做心跳处理
2.A通过tcp连接发送检测数据包,触发发送异常处理.

回复评论 (3)

对这种假连接,这种情况最好的办法就是做心跳处理了。心跳处理做成单独的一个任务,新加一个这么的功能,也不需要修改原来的代码,不影响原来的东西。
修改keep alive参数使得超时时间缩短也是个办法
点赞  2009-5-6 20:45
TCP连接异常情况只能通过心跳或超时处理,这一点办法都没有,因为他本身没有心跳机制.
比如B把网线拔了,A是无法知道这条TCP连接已经断了.
这很容易证明:当A与B之间建立好连接后,若它们之间不发送任何数据,它们之间抓不到任何的包,
所以当B异常断开后,A是无法发现的.

但如果A与B是直边的,那A可以检测自己与B相连的端口是up还是down来判断.但要是中间经过交换机,这方法就不行了

最好的方法还是心跳.
当然超时也是可以的,但并不一定是你所说的协议栈2小时超时,在你的应用程序可以设置当从该端口十分钟未收到任何数据,就认为该连接断了,把连接给删掉
点赞  2009-5-6 20:53
本场景解决如下
因为是个不对称的连接,B向A在给定时间内向A发送一个探测数据包触发select事件,处理该事件解决;
前提A,B有内部协议校验.
点赞  2009-5-8 17:50
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复