windsmile 发表于 2021-9-29 10:49:30

LWIP udp通讯未接收的端口造成阻塞的问题求教

各位大神,我遇到个lwip的问题,能否抽空帮看看
测试程序:socket方式。我单片机作为udp客户端使用随机分配的端口(实测4667)往电脑30000端口周期性发送数据,因为不关心应答,所以只发不接收。另外单片机还开了个udp服务器,端口为6000侦听别的消息。
遇到的问题:电脑如果往单片机4667回复报文8条后,lwip就塞死了,任何报文都进入不了单片机的应用层。

问题排查:走读代码后,我发现是recv_udp函数里会进行buf = (struct netbuf *)memp_malloc(MEMP_NETBUF);如果申请不到内存则会丢弃报文pbuf_free(p);申请到了则会最终发送收到报文的消息sys_mbox_trypost(&conn->recvmbox, buf)。这个buf空间最终正常释放是在lwip_recvfrom函数里netbuf_delete((struct netbuf *)buf);释放的。但是我既然不关心4667端口了,所以也就不会对这个socket里进行接收处理,这样就永远不会释放上面说的buf。
一旦不释放就所有进来的报文都到达不了应用层了。进来的报文因为在recv_udp里申请不到buf空间报文就被丢弃了。

尝试解决:我想自己加个代码,在buf申请不到内存时,自己释放最老的buf。但是遇到的问题是这个buf如果是给6000端口的,等到6000端口的接收处理时又会释放一次buf 这样就会导致乱套了。但是我又无法区分应用层哪个buf会被释放。感觉关联的东西挺多的。软件功力不行 ,改不动

saccapanna 发表于 2021-9-29 13:21:40

内存不够吗?加大缓存啊,还有就是 LWIP 一些参数的配置,好好看看。

saccapanna 发表于 2021-9-29 13:22:10

LWIP 底层不要轻易去改,除非你非常熟悉,有些问题修改配置能够解决,还是很稳定的。

windsmile 发表于 2021-9-29 14:35:32

saccapanna 发表于 2021-9-29 13:22
LWIP 底层不要轻易去改,除非你非常熟悉,有些问题修改配置能够解决,还是很稳定的。 ...

不是内存不够是他的机制在这不做recv的话总有耗尽的时候
看了半天 实在改不动最后变通的解决了监测快耗尽的时候,让最低优先级的任务去recv所有socket释放他

saccapanna 发表于 2021-9-30 16:31:15

你用的那个版本的 LWIP ?

windsmile 发表于 2021-9-30 16:33:22

saccapanna 发表于 2021-9-30 16:31
你用的那个版本的 LWIP ?

用的2.0.2 我看了下后续版本的升级记录 没有关于此问题的升级

saccapanna 发表于 2021-9-30 16:57:30

我使用的 V2.0.3 感觉很稳定,至少 TCP 是非常稳定的,所以可以试试这个版本。

风过不留痕z 发表于 2023-12-26 09:32:24

saccapanna 发表于 2021-9-30 16:57
我使用的 V2.0.3 感觉很稳定,至少 TCP 是非常稳定的,所以可以试试这个版本。 ...
(引用自7楼)

请教一下,如果是单片机和电脑网线直连,可以很稳定的在4-5ms内定时发送数据吗?
页: [1]
查看完整版本: LWIP udp通讯未接收的端口造成阻塞的问题求教