在某项目的应用场景下,使用LwIP协议栈的板卡作为客户端。通常,客户端启动后,会主动执行两个初始步骤:
A.首先发送一次ARP请求包,其目的IP地址为服务器端的IP地址;
B.接着执行TCP客户端初始化函数,尝试进行三次握手流程。
服务器端的启动存在两种情况:
情况1:服务器端先于客户端启动
在该情况下,服务器端会立即响应客户端执行的初始步骤A、B,客户端将正常连接将服务器端;
情况2:服务器端后于客户端启动,或服务器端在TCP连接正常的情况下突然断电再上电;
在该情况下,服务器端后于客户端启动,由于客户端不再执行上述两个步骤A、B,则客户端将永远无法连接上服务器端。
项目应用场景下正常使用流程是作为客户端的板卡会优先启动,服务端是根据实时需求随机开关电。因此应用场景属于情况2。
因此,对于情况2板卡客户端需要额外定时执行两个步骤:
步骤1:
查询当前TCP连接状态,若未连接则执行TCP客户端初始化函数尝试重新连接;
步骤2:
由于服务器端可能后于客户端上电,且上电后并不会主动定时发送包含自身MAC地址的ARP响应包,所以需要客户端节点主动周期发送ARP请求包,该包中请求的目的地址就是服务器端的IP地址。
通过上述两个步骤,即可保证在服务器端后上电且不会主动发送自身MAC地址信息的条件下,实现客户端在服务器端随机上电的情况下正常连接上服务器端。