linux下ntpdate网络对时引发的血案

序言

事情是这样的,Mqtt里面用的时间超时是用系统时间戳来计算的,然后在测试的过程中偶然发现Mqtt 在进入yield 的过程中会出不来,就是一直在里面等待,然后我一路往下看代码也没发现有可能阻塞的地方,然后反过来看超时的地方用的是系统时间戳,这块引起了我的注意,果不其然,我用date查看系统时间是2036年,难道穿越了,这时间怎么不对,现在才2020年啊,难道是ntpdate对时的时候出问题了,这也不应该啊,我反复测试ntpdate也没出现问题,然后我发现这个问题只有在系统重启的时候才有可能出现

看来是我自己把自己坑了,我在系统启动的时候加了脚本做ntpdate的对时,然后在程序里面启动时也有对时,通过log可以看出来,在对时之前两者获取的基础时间是一样的,那么第一个ntpdate在基础时间上加了一个差值,而第二个ntpdate程序并不知道第一个已经加过时间了,所以又加了一些,实际上第二次加的时候时间已经被第一个ntpdate加过一次时间了,所有时间超前了

为什么会影响到MQTT呢

我的程序为了保证本地与服务器的时间尽量一致,所以会间隔一段时间再去同步一次时间,防止本地时钟不准出现过大的误差,所以由于刚开机时的对时错误现在的时间是2036年,再次对时后时间回到了正常时间2020,而Mqtt的超时计算又是基于时间戳的,这下好了,Mqtt获取了一个2036年的某个时间戳再加一定的超时时间在哪儿等待超时,而现在的时间被改成了2020年,如果一直这样等下去只有等到2036才会返回

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值