Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
LWIP中多连接下内存释放的问题请教
发布于 2014-04-23 22:44:20 浏览:3086
订阅该版
大家好,下面有一些问题请教一下大家。 当前板子配置为TCP服务器,等待多个客户端的连接。由于客户端那边的网络设置的问题,客户端连接到服务器之后,自行断开时候是没有通知信息到服务器,客户端每次控制服务器的时候都是需要重新发起连接的(我也不知道那边的网络为什么要这样设计,请勿吐槽了,嘿嘿)。 当前的解决方案是,端口1成功连接服务器并创建对应的线程,然后端口2连接成功连接服务器之后先删除端口1的线程,然后再创建端口2的线程。。。。。思路大概就是这样 现在出现的问题就是,删除前一个线程的时候,并关闭全部的连接之后,发现内存释放的很慢,有时候要1分钟。比如服务器没有任何客户端连接的时候,内存使用时3612,端口1连接,端口2连接并删除端口1的线程,内存是5556,最后关闭端口2的连接,变为3844,在过30秒或者更长才变为3640。此后,更加严重的问题就是它回不到3612,而且每次后面的循环连接之后,不见的28(28=3640-3812)字节会累积上升占用。 请问大家,这是为什么,是不是线程的创建于调度出现了问题了??说一些意见!谢谢了(流水账,请多多包涵! [s:175] [s:175] ) ```if (listen(sock, 5) == -1) { rt_kprintf("Listen error "); /* release recv buffer */ rt_free(recv_data); return; } // tcp_recv_thread_last = tcp_recv_thread; mtcp_parm.recv_data = recv_data; mtcp_parm.connected = -1; rt_kprintf(" TCPServer Waiting for client on port 1201... "); while (stop != RT_TRUE) { sin_size = sizeof(struct sockaddr_in); /* 接受一个客户端连接socket请求,调用该函数是阻塞式的,也就是说调用该函数之后是一直处于等待状态,该线程会被suspend的*/ connected = accept(sock, (struct sockaddr *)&client_addr, &sin_size); /* 返回连接成功的socket */ /*接收放回的client_addr指向客户端的地址信息*/ rt_kprintf("I got a connection from (%s , %d) ", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));//输出客户端的ip地址和发出数据的端口 if (mtcp_parm.connected !=-1) { lwip_close(mtcp_parm.connected); //关闭前一个客户端的连接 rt_kprintf("Close mtcp_parm.connected %d ", mtcp_parm.connected); // rt_free(mtcp_parm.recv_data); rt_thread_delete(tcp_recv_thread); //删除前一个客户端的连接线程,从而释放内存 rt_kprintf("Delete tcp_recv_thread. "); } mtcp_parm.connected = connected; //保存前一个的客户端连接句柄,用于删除删前一个的客户端的连接 tcp_recv_thread = rt_thread_create("tcp_recv", mtcp_recv, &mtcp_parm, /*创建后一个客户端连接线程*/ 1024, 13, 20); if (tcp_recv_thread != RT_NULL) { rt_thread_startup(tcp_recv_thread); rt_kprintf("tcp_revc_thread OK %d ! ", connected); } else { rt_kprintf("tcp_revc_thread fail "); lwip_close(connected); rt_kprintf("Close connected %d. ", connected); } } /*如果关闭服务器之后,就关闭这个socket*/ lwip_close(sock); /*释放刚才申请的内存*/ rt_free(recv_data); return ; } /** * TCP SERVER的 客户端连接 **/ void mtcp_recv(void *parameter) { char *recv_data; int connected, bytes_received; struct mtcp_parm *mtcp_parm; mtcp_parm = (struct mtcp_parm *)parameter; connected = mtcp_parm->connected; recv_data = mtcp_parm->recv_data; send(connected, WELCOME_STR, 100, 0); //发送 欢迎..... while (1) { /* 从连接到的socket中读取数据,然后将数据储存到缓冲区recv_data中*/ bytes_received = recv(connected, recv_data, 512, 0);/*bytes_received是接收数据的大小*/ if (bytes_received <= 0) { /* 如果收到的数据小于0,那么证明接收出错了,关闭这个连接到的socket*/ rt_kprintf("TCP recevied 0 bytes. "); lwip_close(connected); rt_kprintf("Close connected %d. ", connected); mtcp_parm->connected = -1; break; } else { /*其他数据,打印出来*/ aningcomp(recv_data, connected, bytes_received); } } rt_kprintf("mtcp_recv thread %d out ", connected); }``` ![51.jpg](https://oss-club.rt-thread.org/uploads/5057_0d2f487def4923725efe84bdda4b1a26.jpg) ![50.jpg](https://oss-club.rt-thread.org/uploads/5057_00abd84ac8416c5316a14c67dae5cdbd.jpg)
查看更多
3
个回答
默认排序
按发布时间排序
bernard
2014-04-25
这家伙很懒,什么也没写!
可以用list_tcp函数看看连接情况
Yafei
2014-04-25
这家伙很懒,什么也没写!
对于TCP,你这样子做肯定有问题,服务器端TCP连接应该进入了TIME_WAIT状态,可以list_tcps()查看,要等待2分钟这个连接才会被回收。
撰写答案
登录
注册新账号
关注者
0
被浏览
3.1k
关于作者
chuck
这家伙很懒,什么也没写!
提问
7
回答
7
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
【NXP-MCXA153】 定时器驱动移植
2
GD32F450 看门狗驱动适配
3
【NXP-MCXA153】看门狗驱动移植
4
RT-Thread Studio V2.2.9 Release Note
5
CherryUSB的bootuf2配置
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
freemodbus
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
踩姑娘的小蘑菇
7
个答案
2
次被采纳
a1012112796
18
个答案
1
次被采纳
Ryan_CW
5
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
本月文章贡献
YZRD
3
篇文章
6
次点赞
catcatbing
3
篇文章
6
次点赞
lizimu
2
篇文章
9
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部