关于w5500中KeepAlive的学习

       最近客户反馈了一个很蛋疼的问题,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,是不是很简单,嗯?

关于w5500中KeepAlive的学习_第1张图片

手动模式

        咳咳咳,这种模式有点小烦人,因为你要考虑什么时候发送KeepAlive,在此简要说明一下,标号4那句话主要是设置超时时间,这个没啥说的,需要说明的是setsockopt会判断当前是否为TCP模式,判断为非TCP模式,直接就返回了,还检测个毛线。随意标号3和6 是必须有的,最后把那个所谓的状态机(其实就是个switch)放在SOCK_OK里面就可以了,以下是整体思路。

关于w5500中KeepAlive的学习_第2张图片

好像这样就OK了,但是官方提供的setsockopt函数有点问题,请看下图:

关于w5500中KeepAlive的学习_第3张图片

这是setsockopt函数的一部分,如果你拿到官方提供的库跟上图一样,请把图中红色框框的代码注释掉。因为。。。。还是看官方手册吧!

关于w5500中KeepAlive的学习_第4张图片

可能是写库的作者出于安全的考虑,设置好CR寄存器后还很 “骚气” 的读一下,就是这一读,让LZ差点拿起《TCP详解》。

好了,不生气了,碎觉zZ~

你可能感兴趣的:(关于w5500中KeepAlive的学习)