lwip1.3.2+ucosII服务器与浏览器连接问题bug解决

来源:互联网 发布:erp企业管理系统源码 编辑:程序博客网 时间:2024/06/07 04:01
最近利用lwip1.3.2+ucosII在stm32f207搭建了web服务器,实现功能并不容易,但最难的却是功能实现之后查找bug的过程,这个过程可以说相当辛苦,但经历了这些我发现我也学习成长了很多,这里主要分享下我遇到的bug,以及解决方式,首先说明下我搭建的服务器带基本认证服务。1. phy驱动初始化问题   因为stm32f207中引脚问题我的项目只能采用RMII总线,这时就需要修改默认系统时钟需要修改为100MHZ(见system_stm32f2xx.c)。               参考DP83848的CLK说明,可以知道输入管脚CLK(端口PA8)的时钟要为50MHZ,PA8位于APB2区域,在参考system_stm32f2xx.c中程序,PCLK = SYSCLK/2             可知系统时钟需要配置到100MHZ,如果系统时钟达不到100MHZ,如STM32F107,则需要使用MII总线。    2. 在某些浏览器在初次登录会弹出两次登录框体(如遨游),且有时会卡死服务器 通过WireShark软件抓包分析,几乎所有浏览器在请求完一张完整网页后会继续请求favicon.ico(网站头像,如下),用于放置在地址栏或者收藏夹的首位,且有时该请求报会不附带用户的认证信息,因为它并不存在于服务器端用户设计的网页中(一般情况下),因此客户端可能会一直请求,造成服务器卡顿,因此在服务器的http层代码中要对该请求独立出来处理。            3 .win7+IE8访问服务器是偶尔会卡死  win7+IE8访问服务器时,当缓存已经有图片时,会发送[RST, ACK] TCP包    目前我所用的版本的lwip的tcp层对于该数据报的处理并不好,我测试了下,接收到RST,ACK包必卡死  经过仔细排查,我发现了问题关键,在处理[RST ACK]复位包的回调函数中err_tcp中,将连接的conn->err 置成了ERR_RST,  而在线程中调用的netconn_accept()和netconn_delete()并未修改这个参数,而在http层处理函数中将conn->err作为判断接收数据的一个标准,从而导致再也接不到数据。  因此在复位连接处理完毕(即在err_tcp)末尾后要添加conn->err = ERR_OK,不知道是不是lwip的内在缺陷。

0 0
原创粉丝点击