OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3165|回复: 7

关于STM32F429 LWIP netconn编程疑问

[复制链接]

6

主题

21

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-12-4
在线时间
25 小时
发表于 2020-6-4 11:04:41 | 显示全部楼层 |阅读模式
1金钱
我用原子哥的,LWIP netconn方法创建了一个Server.然后直接拔网线.拔网线处理方法如下
  1. netconn_shutdown(newconn,0,0);
  2.       netconn_close(newconn);
  3.                         netconn_delete(newconn);
  4.       while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX){}
  5.     //  printf("Close:%d,Del:%d\r\n",a,b);
  6.                 //        printf("Client:%d.%d.%d.%d,Port:%d Close\r\n",remot_addr[0], remot_addr[1],remot_addr[2],remot_addr[3],port);
  7.       DebugServerConnCount = 255 ;
  8.       vPortFree(recvbuf);
  9.       vPortFree(q);
  10.       osThreadExit();     //网线已经拔掉,此线程自杀
复制代码
这时候,虽然内存释放了.但是连接其实没有正常断开.LWIP TCP配置如下
  1. #define LWIP_NETCONN  1
  2. #define MEMP_NUM_NETBUF 10
  3. #define MEMP_NUM_NETCONN 10
  4. #define MEMP_NUM_TCP_PCB  3
  5. #define LWIP_SOCKET 1
  6. //#define LWIP_COMPAT_MUTEX 1
  7. #define LWIP_SO_RCVTIMEO  1
  8. /*----- Default Value for LWIP_NETIF_LINK_CALLBACK: 0 ---*/
  9. #define LWIP_NETIF_LINK_CALLBACK 1

  10. //LWIP memory size
  11. #define MEM_SIZE    2097152
复制代码
不用在意内存分配太大.我把SDRAM的32MB 分配给FreeRTOS 和LWIP 的内存,他们俩分配的内存都在SDRAM中.
#define MEMP_NUM_TCP_PCB 3  这一句,是连接数量限制.
现在问题是:
1:只要我连接着拔掉网线,这样来回3次,就达到最到数量限制了.不允许新的连进来.请问,拔掉网线后,应该怎么清空LWIP中正在连接的数量?
///////////////////////分隔线//////////////////////////////////////////////////////////
可以分享程序:
1:程序目前实现了新申请的变量自动定位到SDRAM去,内存使用更噬无忌惮,利用linker链接脚本实现.
2:移值了FreeModbus ,使用TCP.  移植的代码进行少量修改后才可使用.
3:代码除了SDRAM部分代码,参照了原子哥的.其它全是由Stm32cubeMX 自动生成.
4:集成了LWIP FreeRTOS.
5:自己画的4层PCB,网卡管脚配置和原子哥的不一样.
6:程序实现了网线热插拔.Stm32cubeMX 支持配置热插拔.只需要在相关函数中实现相关功能.

程序保证能顺利编译,并运行.
程序编译环境
系统:Mac OS 或 ubuntu
编译工具 : arm-none-eabi-gcc
编译脚本 : Makefile

如果有需要程序的可以留言.

最佳答案

查看完整内容[请看2#楼]

哈哈,那就好,我怀疑是协议栈有自己的调度机制,不是那么快就能释放的,线程杀掉后就有问题了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

54

主题

1008

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2384
金钱
2384
注册时间
2012-11-22
在线时间
403 小时
发表于 2020-6-4 11:04:42 | 显示全部楼层
nczywqq 发表于 2020-6-4 16:34
厉害了,大佬.我延时关闭线程,就好了.

哈哈,那就好,我怀疑是协议栈有自己的调度机制,不是那么快就能释放的,线程杀掉后就有问题了。
态度决定一切
回复

使用道具 举报

54

主题

1008

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2384
金钱
2384
注册时间
2012-11-22
在线时间
403 小时
发表于 2020-6-4 13:41:15 | 显示全部楼层
1、确定netconn_close(newconn);netconn_delete(newconn);执行了么?这个执行成功了,PCB块就会释放的。
2、确定拔掉的是server的网线?如果连接在交换机上,你拔掉client的网线是没用的。
态度决定一切
回复

使用道具 举报

6

主题

21

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-12-4
在线时间
25 小时
 楼主| 发表于 2020-6-4 13:57:29 | 显示全部楼层
冰封嗜魔 发表于 2020-6-4 13:41
1、确定netconn_close(newconn);netconn_delete(newconn);执行了么?这个执行成功了,PCB块就会释放的。
2 ...

netconn_close(newconn);netconn_delete(newconn);
确定执行了,返回值是0;
网线是直连的,板子直接插电脑.
只有点正常关闭,才不会有问题.
连接中,直接拔网线,连接计数不会清除,
我现在是,每增加一个连接会新建一个线程.拔网线和点关闭,套接字的地址都一样的,证明内存已经释放了.如果没释放地址会累加.
只是连接没有正常清除.导致达到最大连接数,而不能增加连接.
回复

使用道具 举报

54

主题

1008

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2384
金钱
2384
注册时间
2012-11-22
在线时间
403 小时
发表于 2020-6-4 14:11:29 | 显示全部楼层
nczywqq 发表于 2020-6-4 13:57
netconn_close(newconn);netconn_delete(newconn);
确定执行了,返回值是0;
网线是直连的,板子直接插电 ...

1、那就不科学了,我也是这样用的,一点问题都没有。你执行netconn_close(newconn)之前打印下newconn,看看是不是有效的。
2、你的accept是一个单独的线程么?每一个新的链接的newconn是如何在accept线程中获取句柄的?是通过新建任务的时候传入的指针么?
3、MEMP_NUM_NETCONN最好设置成5,这样如果3个TCP块都被用完了,新链接来的时候会强制杀掉最旧的链接,默认MEMP_NUM_NETCONN是4,链接超过3个就会报错了。
态度决定一切
回复

使用道具 举报

6

主题

21

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-12-4
在线时间
25 小时
 楼主| 发表于 2020-6-4 15:06:41 | 显示全部楼层
冰封嗜魔 发表于 2020-6-4 14:11
1、那就不科学了,我也是这样用的,一点问题都没有。你执行netconn_close(newconn)之前打印下newconn,看 ...

1:newconn是有效的.
2:accept有一个单独线程在监听.新连接来了,会创建一个线程来处理数据.传入指针的.
3:我设置成3是为了测试直接拔网线,线程关闭连接存在问题.
4:其实我可以设置成100个.因为有32MB的内存.只是为了找问题
回复

使用道具 举报

54

主题

1008

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2384
金钱
2384
注册时间
2012-11-22
在线时间
403 小时
发表于 2020-6-4 15:14:19 | 显示全部楼层
nczywqq 发表于 2020-6-4 15:06
1:newconn是有效的.
2:accept有一个单独线程在监听.新连接来了,会创建一个线程来处理数据.传入指针的.
...

1、那你再仔细分析吧,我这边用没发现有啥问题。
2、你尝试下关闭链接后加点延时再关闭线程,或者不关闭线程。
3、不是TCP块的数量的问题,我的意思是NETCONN块的数量要比TCP块多2个,这样能实现踢掉最旧的链接,起码能保证你后面的链接能连上,哪怕你前面的链接没能释放。
态度决定一切
回复

使用道具 举报

6

主题

21

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-12-4
在线时间
25 小时
 楼主| 发表于 2020-6-4 16:34:16 | 显示全部楼层
冰封嗜魔 发表于 2020-6-4 15:14
1、那你再仔细分析吧,我这边用没发现有啥问题。
2、你尝试下关闭链接后加点延时再关闭线程,或者不关闭 ...

厉害了,大佬.我延时关闭线程,就好了.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 03:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表