问题一:组播绑定失效导致无法接收组播报文
背景:
项目中一个封装的库负责UDP绑定,使用配置文件中指定的组播地址。设备为降低功耗会进入休眠状态,休眠时需要卸载网卡。唤醒后重新加载网卡,但发现程序无法接收到组播报文。
原因分析:
排查发现,程序中组播绑定的设置在设备唤醒后失效,需要重新设置组播绑定。但绑定操作位于封装好的库(非开源)中,无法直接修改代码。
解决方案:
在另一个程序中重新为网卡绑定组播地址,作为唤醒后恢复组播通信的补充机制。
问题二:本地套接字绑定失败(EADDRINUSE)
背景:
本地server程序通过套接字通信,配有启动脚本。脚本在启动程序前会先执行rm
命令删除对应的sock管道文件,然后立即启动程序完成套接字绑定及初始化。
问题现象:
在大规模设备部署后,极低概率出现bind
失败的情况,报错信息为EADDRINUSE
,表示绑定时套接字管道文件已存在。
原因分析:rm
命令返回成功后,文件未必立刻被删除,可能文件系统的同步延迟导致文件仍然存在。
解决方案:
在启动脚本中增加删除文件的确认步骤:循环判断管道文件是否真正被删除,只有确认文件不存在后才启动程序。