|
各位大神,我遇到个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会被释放。感觉关联的东西挺多的。软件功力不行 ,改不动 |
|