嵌入式技术论坛
直播中

安德森大

8年用户 1293经验值
擅长:接口/总线/驱动
私信 关注
[问答]

webnet使用浏览器刷新失败如何解决

项目背景:STM32F103RE 64K Ram. 512k ROM。

现在计划在产品中加入网页功能,使用USB虚拟网卡,rndis。使用ROMFS做文件系统。LWIP做网络协议栈。因为资源紧张,所以对原有的配置做了适当的裁剪。
目前网页功能可以正常使用,可以访问页面及cgi请求。

版本信息:

RT - Thread Operating System
/ | \ 4.0.2 build Oct 14 2019
RT-Thread webnet package (V2.0.0) initialize success.

异常情况:调试初期发现用浏览器刷新页面,经常打不开,偶尔成功几次,而且等待时间很长。
后面测试发现,用postman工具多次请求正常。用浏览器请求,几次后失败,然后等待一段时间之后又正常。

LWIP配置:

#define RT_MEMP_NUM_NETCONN 8
#define RT_LWIP_PBUF_NUM 8
#define RT_LWIP_RAW_PCB_NUM 4
#define RT_LWIP_UDP_PCB_NUM 4
#define RT_LWIP_TCP_PCB_NUM 4
#define RT_LWIP_TCP_SEG_NUM 10
#define RT_LWIP_TCP_SND_BUF 1024
#define RT_LWIP_TCP_WND 1024
#define RT_LWIP_TCPTHREAD_PRIORITY 10
#define RT_LWIP_TCPTHREAD_MBOX_SIZE 8
#define RT_LWIP_TCPTHREAD_STACKSIZE 2048
#define RT_LWIP_ETHTHREAD_PRIORITY 12
#define RT_LWIP_ETHTHREAD_STACKSIZE 1024
#define RT_LWIP_ETHTHREAD_MBOX_SIZE 8
#define LWIP_NETIF_STATUS_CALLBACK 1
webnet配置:

#define PKG_USING_WEBNET
#define WEBNET_PORT 80
#define WEBNET_CONN_MAX 1
#define WEBNET_ROOT "/webnet"
#define WEBNET_USING_LOG
#define WEBNET_USING_AUTH
#define WEBNET_USING_CGI
#define WEBNET_USING_ASP
#define WEBNET_USING_SSI
#define WEBNET_USING_INDEX
#define WEBNET_USING_ALIAS
#define WEBNET_USING_UPLOAD
#define WEBNET_CACHE_LEVEL 2
#define WEBNET_CACHE_MAX_AGE 1800
#define WEBNET_USING_SAMPLES
#define PKG_USING_WEBNET_V201
buffer:1K
堆栈:2K

后使用memtrace工具,发现,用浏览器请求过程中,webnet会分配多个对话,并且没有释放。

[0x2000e720 - 1K] webn
[0x2000eb60 - 32] webn
[0x2000eb90 - 256] webn
[0x2000eca0 - 36] webn
[0x2000ecd4 - 20]
[0x2000ecf8 - 20] webn
[0x2000ed1c - 48]
[0x2000ed5c - 96] webn
[0x2000edcc - 356]
[0x2000ef40 - 32] webn
[0x2000ef70 - 32] webn
[0x2000efa0 - 100]
[0x2000f014 - 32] webn
[0x2000f044 - 32] webn
[0x2000f074 - 32] webn
[0x2000f0a4 - 48]
[0x2000f0e4 - 32] webn
[0x2000f114 - 32] webn
[0x2000f144 - 32] webn
[0x2000f174 - 40] webn
[0x2000f1ac - 32] webn
[0x2000f1dc - 40] webn
[0x2000f214 - 32] webn
[0x2000f244 - 32] webn
[0x2000f274 - 32] webn
[0x2000f2a4 - 136]
[0x2000f33c - 32] webn
[0x2000f36c - 1K] webn
[0x2000f7ac - 380]
[0x2000f938 - 32] webn
[0x2000f968 - 1K] webn
[0x2000fda8 - 568]
msh />list_webnet
#0 client 192.168.10.2:56862
#1 client 192.168.10.2:56861
#2 client 192.168.10.2:56856
path: /webnet/demo.html
从日志现象来看,应该是web服务器一直在被访问某个接口,并且一直没有被释放掉,导致多次请求之后,内存空间不够,
请求失败(配置中设置最多只有一个链接,但是还是会有多个请求)。
后来观测发现,经过比较长的时间之后,约几分钟,原先一直在连接又被释放掉,回复正常。

具体回话没有断开的 问题还未找到。
使用过程中还有以下的未知异常请求:
第一次插入USB线时,会多次请求(浏览器未打开):

[D/wn.log] new client: 192.168.10.2:61817
[D/wn.log] method: GET
[D/wn.log] request: /
[D/wn.log] physical url: /webnet/index.html
[D/wn.log] mime type: text/html

第一次请求IP地址时(访问源码自带的例子):

[D/wn.log] new client: 192.168.10.2:62085
[D/wn.log] method: GET
[D/wn.log] request: /favicon.ico
[D/wn.log] physical url: /webnet/favicon.ico
[D/wn.log] mime type: application/binary

有做过的大神可以指点一下下。

回帖(3)

李波

2022-9-28 10:06:20
内存不够吧
举报

李梅

2022-9-28 10:06:27
浏览器按F12,切到网络这一列,可以看到哪些链接断了。

TCP这边的数据可能开大些,webnet里面的同时连接数要小些。不然就会有死链。
举报

安德森大

2022-9-28 10:06:54
WEBNET_CONN_MAX配置中这个宏设置同时最大的连接数,我看着工程中只有一个地方用到了,

    if (listen(listenfd, WEBNET_CONN_MAX) == -1)
    {
        LOG_E("Socket listen(%d) failed.", WEBNET_CONN_MAX);
        goto __exit;
    }
就是代码中只限定同时连接的socket。但是session并没有做限定。
假如特殊情况socket断开,session并没有释放,这个时候新的连接进来,就会创建新的session,资源就越来越少了,这应该算个bug。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分