这两天我们都在重复的测试汉枫的串口服务器HF2211,当把串口服务器当做TCP-CLIENT来用,去连接服务器端的时候,我发现我把掉网线再连接后,串口服务器的状态栏里面依然显示为连接成功!
这是个奇怪的问题,我记得我以前做危急值报告系统时候为了实现长连接,在TCP层面使用心跳包才解决网络中断后重连的问题。
百度了一下KeepAlive机制,才恍然大悟。
在以前我们做断网重连,采用发送心跳包的方式来判断网络是否是断了,因此客户端需要发送心跳包,服务端要回复心跳包,这样客户端和服务端才都能够知道是否网络断开了。
在windows2000以后,TCP协议已经增加了KeepAlive的协议了,而且在windows和Linux上都支持。有一端设置了keepalive的话,例如10s,在没有数据传输的时候,设置了这一端就会发包去询问另外一端是否在线,如果不在线就直接把错误抛出来,那么程序就能够识别网络是否断开,Client端再去重新连接。
经过我的测试一般设置client端30s,Server端60s。之所以不同是为了错开两个的时间,刚好都设置30秒容易一端刚连上,另外一端又断开了。
那么既然TCP协议有了keepalive机制,我们还在程序应用层发心跳包有啥意义呢?
哦,大概是用来确保更加稳定的连接,以及除了网络层是好的,程序的逻辑层是否也好的?能够发心跳包,大概程序没卡死,至少数据处理的线程还活着吧!
Cache数据库也是支持keepalive的,但是接口开发的要求就会高一点了,你要识别出断网的错误,然后进行重连:
if ($$$ISERR(status))
{
d ..Trace(“READ_ERROR:”_$ZERROR)
i (..IP’=””)
{
hang 10
if (..Open(..IP,..Port,..CharEncode))
{
d ..Trace(“RECONNECT_SUCESS:”)
}
}
}
然后又回去看了一下MOXA的串口服务器,并没有KeepAlive,看来廉颇老矣!
如无特别说明,本博客文章皆为原创。转载请说明,来自吵吵博客。
吵吵微信朋友圈,请付款实名加入: