nRF9160通过LTE-M/IPv6下载文件时recv出现EMSGSIZE错误求助
检查调制解调器侧接收缓冲区的溢出逻辑
你设置了发送块为1280B,但调制解调器安全Socket缓冲区上限是2KB,要确认调制解调器是否在累积多个IPv6分片后,尝试一次性把超过2KB的数据推给应用层。IPv6允许分片,网络侧可能发送多个分片,调制解调器如果重组后的数据超过缓冲区上限,就会触发EMSGSIZE错误。试试在应用层强制recv()的单次接收大小设为≤2KB(比如1920B),不用默认的大缓冲区,看能不能避免崩溃。验证调制解调器固件版本
nRF9160的调制解调器固件在Socket卸载、IPv6分片处理场景下有过已知bug,尤其是旧版本。检查当前固件版本,升级到最新稳定版(比如v1.3.x及以上),部分旧版本累计接收一定量数据后会出现缓冲区管理异常,导致EMSGSIZE错误。排查Socket卸载的分片重组配置
确认是否开启了调制解调器的IPv6分片重组功能,有些配置下,调制解调器会自动重组分片但没考虑自身缓冲区上限。可以用AT命令AT%XMOBCONFG查看当前IP配置,或者禁用调制解调器的分片重组,让应用层自行处理分片(虽然增加应用层复杂度,但能验证问题是否出在调制解调器的重组逻辑)。监测TCP窗口大小协商情况
就算你设置了发送块大小为1280B,TCP窗口协商可能让远端发送更大的报文段。用nRF Connect的LTE链路分析工具抓包,查看实际TCP报文大小,是否存在超过调制解调器缓冲区上限的情况。如果远端发送的TCP段加IPv6头部后超过2KB,就会触发EMSGSIZE。这时可以在应用层通过setsockopt()设置TCP窗口大小,限制远端发送的报文段大小不超过调制解调器缓冲区的可用空间。检查Socket卸载的内存泄漏问题
每次到49KB崩溃看似是固定阈值,但也可能是调制解调器卸载Socket时存在内存泄漏,累计到一定量后导致缓冲区分配失败,部分实现会用EMSGSIZE错误码表示内存不足。可以在每次下载前重启调制解调器,或者下载过程中用AT命令AT%XMEMUSE周期性查询调制解调器内存使用情况,看内存是否持续下降。
内容的提问来源于stack exchange,提问作者Voxorin

