OpenEdv-开源电子网

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

webserver网页打不开的问题

[复制链接]

27

主题

118

帖子

0

精华

高级会员

Rank: 4

积分
850
金钱
850
注册时间
2015-12-8
在线时间
176 小时
发表于 2017-12-6 19:57:31 | 显示全部楼层 |阅读模式
5金钱
网页的代码为[mw_shl_code=c,true]HTTP/1.1 200 OK\r\nContent-type: text/html\r\n\r\n<html><head><title>Congrats!</title></head><body><h1>Welcome to our lwIP HTTP server!</h1><p>This is a small test page, served by httpserver-netconn.</body></html>\r\n\r\n[/mw_shl_code]

webserver收到一个TCP连接请求就开启一个子线程,子线程代码为[mw_shl_code=c,true]//TCP服务器子线程任务函数
static void tcp_server_thread_task(void *p_arg)
{
        OS_ERR err;
        err_t recv_err,write_err;
        struct netconn *conn;
        struct netbuf *recvbuf;
        char *data;
        u16 len;
        u8 i;
        conn=(struct netconn *)p_arg;
        //conn->recv_timeout = 10;
        while(1)
        {
                recv_err=netconn_recv(conn,&recvbuf);
                if(recv_err==ERR_OK)
                {
                        netbuf_data(recvbuf,(void **)&data,&len);
                                //printf("%s",data);
                        if (len>=5 &&
        data[0]=='G' &&
        data[1]=='E' &&
        data[2]=='T' &&
        data[3]==' ' &&
        data[4]=='/' ) {
      
                                        write_err=netconn_write(conn, http_index_html, sizeof(http_index_html), NETCONN_COPY);//发送网页

                                }
                        netbuf_delete(recvbuf);        //不要忘记释放BUF
                }
                else
                {
                        netconn_close(conn);
                        netconn_delete(conn);
                        for(i=0;i<TCPSERVER_THREAD_MAX_NUM;i++)
                        {
                                if(TCPSERVER_THREAD.THREAD_TASK_PRIO==OSTCBCurPtr->Prio)
                                {
                                        TCPSERVER_THREAD.flag_use=0;
                                        break;
                                }
                        }
                        printf("%d子线程断开与服务器连接\r\n",i);
                        OSTaskDel(NULL,&err);//删除任务自身
                }
        }
       
}[/mw_shl_code]现在的问题是,服务器返回给浏览器网页之后,要关闭TCP连接,浏览器才会显示出网页内容,如果不关闭则显示不了。有人遇到过这种情况,知道什么原因吗?

最佳答案

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

这个要和浏览器加载页面的机制有关系,浏览器如何判断接收到完整的页面。 在网络中,页面都是二进制传输的,如果没有足够信息,浏览器无法判断是否接收完整页面只会一直延时等待数据接收(也就是你不显示的原因),而http响应头提供这个信息,这就是http响应头被定义的意义。 浏览器解析原理: 1.首先检索响应头的Content-Length参数,确定接收数据长度,当接收到指定长度数据, 就会加载页面(正常流程) 2.对于无Content-L ...
为自己掌握新的知识感到快乐
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1769
金钱
1769
注册时间
2015-6-11
在线时间
313 小时
发表于 2017-12-6 19:57:32 | 显示全部楼层
这个要和浏览器加载页面的机制有关系,浏览器如何判断接收到完整的页面。
在网络中,页面都是二进制传输的,如果没有足够信息,浏览器无法判断是否接收完整页面只会一直延时等待数据接收(也就是你不显示的原因),而http响应头提供这个信息,这就是http响应头被定义的意义。

浏览器解析原理:
1.首先检索响应头的Content-Length参数,确定接收数据长度,当接收到指定长度数据,
  就会加载页面(正常流程)

2.对于无Content-Length信息,或者Content-Length参数大于后续网页长度(错误返回),
浏览器并不会报错,而是根据连接状态来判断,当连接断开才能判断接收到完整的页面了,
也就是你所遇到的情况,当然这种即使对了也会导致很多问题

解决办法: 返回响应头里面添加网页长度(二进制)字段Content-Length:xxxx\r\n,且长度必须一致
可以参考<http权威指南>
回复

使用道具 举报

27

主题

118

帖子

0

精华

高级会员

Rank: 4

积分
850
金钱
850
注册时间
2015-12-8
在线时间
176 小时
 楼主| 发表于 2017-12-6 20:01:49 | 显示全部楼层
不注释掉“conn->recv_timeout = 10”,接收超时自后就会自动关闭TCP连接,浏览器就能显示网页内容,如果不关闭TCP连接,网页能发送出去,但是浏览器不能显示网页
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-12-6 23:41:29 | 显示全部楼层
帮顶
回复

使用道具 举报

27

主题

118

帖子

0

精华

高级会员

Rank: 4

积分
850
金钱
850
注册时间
2015-12-8
在线时间
176 小时
 楼主| 发表于 2017-12-7 08:58:39 | 显示全部楼层

感谢原子哥帮顶,期待大神解答啊
为自己掌握新的知识感到快乐
回复

使用道具 举报

27

主题

118

帖子

0

精华

高级会员

Rank: 4

积分
850
金钱
850
注册时间
2015-12-8
在线时间
176 小时
 楼主| 发表于 2017-12-7 11:45:39 | 显示全部楼层
本帖最后由 Jundodo 于 2017-12-7 11:47 编辑
zc123 发表于 2017-12-7 10:08
这个要和浏览器加载页面的机制有关系,浏览器如何判断接收到完整的页面。
在网络中,页面都是二进制传输的 ...

果然如大神说的一样,加上网页长度以后就好了,不过在网上有看到使用Transfer-Encoding: chunked就可以不用添加网页长度,于是我试了一下,网页代码如下[mw_shl_code=c,true]HTTP/1.1 200 OK\r\nContent-type: text/html\r\nTransfer-Encoding: chunked\r\n\r\n<html><head><title>Congrats!</title></head><body><h1>Welcome to our lwIP HTTP server!</h1><p>This is a small test page, served by httpserver-netconn.</body></html>\r\n\r\n[/mw_shl_code]打开网页显示错误,请问用法上有什么错误吗?
为自己掌握新的知识感到快乐
回复

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1769
金钱
1769
注册时间
2015-6-11
在线时间
313 小时
发表于 2017-12-7 13:00:46 | 显示全部楼层
Jundodo 发表于 2017-12-7 11:45
果然如大神说的一样,加上网页长度以后就好了,不过在网上有看到使用Transfer-Encoding: chunked就可以不 ...

定义为Transfer-Encoding: chunked后,你发送的数据包就要符合chunked的格式
如果一个HTTP消息(请求消息或应答消息)的Transfer-Encoding消息头的值为chunked,那么,消息体由数量未定的块组成,并以最后一个大小为0的块为结束
每一个非空的块都以该块包含数据的字节数(字节数以十六进制表示)开始,跟随一个CRLF (回车及换行),然后是数据本身,最后块CRLF结束。在一些实现中,块大小和CRLF之间填充有白空格(0x20)。
最后一块是单行,由块大小(0),一些可选的填充白空格,以及CRLF。最后一块不再包含任何数据,但是可以发送可选的尾部,包括消息头字段。消息最后以CRLF结尾。
就不是直接发送网页数据了,你现在直接发出去肯定解析出乱码。
回复

使用道具 举报

27

主题

118

帖子

0

精华

高级会员

Rank: 4

积分
850
金钱
850
注册时间
2015-12-8
在线时间
176 小时
 楼主| 发表于 2017-12-7 13:46:56 | 显示全部楼层
zc123 发表于 2017-12-7 13:00
定义为Transfer-Encoding: chunked后,你发送的数据包就要符合chunked的格式
如果一个HTTP消息(请求消 ...

感谢大神指导,明白了
为自己掌握新的知识感到快乐
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 16:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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