第1个回答 2022-07-18
项目是基于MQTT,但重连逻辑被重写过。项目中会先请求LBS接口返回ip地址,再进行socket链接。
之前是只有一个LBS地址,失败之后内部重试链接。现在服务端会返回两个ip地址,第一个失败之后再进行第二个连接。
socket连接使用CFStreamCreatePairWithSocketToHost,超时由系统控制。
socket连接坏的IP地址,超时时间在75s,无法控制超时时间。
在[self.encoder open];时dispatch_after控制超时时间,如果在规定时间内没有回调,则认为ip连接失败。返回给上层,进行下一个ip连接。
源码阅读参考 MQTT源码阅读及问题分析
偶现socket未连接,复现概率比较低。只有结合日志,阅读源码。
突破点在于connectHandler这个block;为什么没有回调。