最近客户反馈了一个很蛋疼的问题,Client异常复位或者没有close socket的话会导致无法重连Server(本人使用W5500作为Server端给Client提供数据)。解决方法可能不止一个,但我只想用TCP的KeepAlive机制来解决这个问题,于是乎在浏览器中游荡了大半天,入了些坑,最终解决了上面的问题。关于W5500的KeepAlive使用,已有不少人用到了。要么是什么什么详解,要么是粘点官方的话,最后粘上工程链接,还特么不能立即获取。我需要的只是一看就能用的代码框架儿,属于 “在线等,比较急” 的那种!
W5500的KeepAlive分为自动和手动两种,自动的话要以5s为时间单位来检测当前连接是否正常,这让尿急的我不能容忍。还是手动比较香,当然用51那种龟速MCU来跑的话就另当别论了。手动的话会产生超时中断,我已经开了两个中断,难道要我在开一个中断,然后在中断里close socket嘛(说实话三个中断嵌套我感觉已经够乱了)。我觉得既然能产生中断,直接判断中断标志来决定要不要释放socket更好一点。即便我设置了W5500的中断,我不鸟它总可以吧!(不去写ISR,因为W5500是通过拉低引脚来通知MCU的)。下面是自动和手动两种不同的检测方式。
自动模式
标号1就是启动自动KeepAlive,是不是很简单,嗯?