野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 6611|回复: 9

用lwip下载网页的问题

[复制链接]
发表于 2013-12-10 18:05:42 | 显示全部楼层 |阅读模式
我在以太网例子里修改了一下,尝试下载网页,好不容易能接受到数据了,但是后面接受到的数据有问题,而且lwip报错了。
我改的代码如下:
建立连接:
void TCP_Client_Init()
{
  struct tcp_pcb *Clipcb;
  struct ip_addr Mipaddr,Lipaddr;

  IP4_ADDR(&Mipaddr,74,125,31,138);        //谷歌ip
  Clipcb = tcp_new();                       // 建立通信的TCP控制块(Clipcb)
  tcp_bind(Clipcb,IP_ADDR_ANY,1024);       // 绑定本地IP地址和端口号
  tcp_connect(Clipcb,&Mipaddr,80,TcpCli_Connected);       

}
连接成功后:
err_t TcpCli_Connected(void *arg,struct tcp_pcb *pcb,err_t err)
{  
   tcp_write(pcb,TCP_TestData,sizeof(TCP_TestData),0)==ERR_OK;
   tcp_recv(pcb,tcpcli_recv);
   return ERR_OK;
}
接受数据:
static err_t tcpcli_recv(void *arg, struct tcp_pcb *pcb,struct pbuf *p,err_t err)
        {  
        tcp_recved(pcb, p->tot_len);
        printf(p->payload);
        pbuf_free(p);
        tcp_close(pcb);

        return ERR_OK;
}

TCP_TestData 为:"GET / HTTP/1.1\r\nAccept-Encoding: gzip, deflate\r\nHost: 74.125.31.138\r\n\r\n"。

串口接受到的数据:

**************野火STM32_enc8j60+lwip移植实验*************
success 1
sucess 4
HTTP/1.1 200 OK
Date: Tue, 10 Dec 2013 09:43:41 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
Set-Cookie: NID=67=GqzHbh4a0inK28OlD41NNas84jnsLIMue_7Tvx2QfupGphmgcdfcqXeERy3TA79UJpFt7nRiL0OpEqdpXhC1144vIPl9eFGZouTz6Q0Wbr615orqFJLROsS4d8CUjhRz; expires=Wed, 11-Jun-2014 09:43:41 GMT; path=/; domain=.; HttpOnly
P3P: CP="This is not a P3P policy! See http://www.google.com/support/ac ... n&answer=151657 for more info."
Server: gws
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Alternate-Protocol: 80:quic
Transfer-Encoding: chunked

8000
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage"><head><meta itemprop="image" content="/images/google_favicon_128.png"><title>Google</title><script>(function(){
window.google={kEI:"TeKmUuK-Gc7OkQXDvYGoCg",getEI:function(a){for(var b;a&&(!a.getAttribute||!
Date).getTime();google.timers.load.t.iml=e;google.kCSI.imc=c;google.kCSI.imn=b;google.kCSI.imp=d;void

。。。。。。。。。。。。。。。。。。太长了省略中间部分。。。。。。。。。。。。。。。。。。。。。

0!==google.stt&&(google.kCSI.stt=google.stt);google.csiReport&&google.csiReport()}}window.addEventListener?window.addEventListener("load",n,!1):window.attachEvent&&window.attachEvent("onload",n);google.timers.load.t.prt=e=(new Date).getTime();})();
</script></body></html>
0
HTTP/1.0 400 Bad Request
Content-Type: text/html; charset=UTF-8
Content-Length: 925
Date: Tue, 10 Dec 2013 0
sucess 4
9:43:43 GMT
Server: GFE/2.0

<!DOCTYPE html>
<html lang=en>
  <meta charset=utf-8>
  <meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-width">
  <title>Error 400 (Bad Request)!!1</title>
  <style>
    *{margin:0;padding:0}html,code{font:15px/22px arial,sans-serif}html{background:#fff;color:#222;padding:15px}body{margin:7auto 0;max-width:390px;min-height:180px;padding:30px 0 15px}* > body{background:url(//www.google.com/images/errors/robot.png) 10020001864x no-repeat;padding-right:205px}p{margin:11px 0 22px;overflow:hidden}ins{color:#777;text-decoration:none}a img{border:0}@media screen and (max-width:772px){body{background:none;margin-top:0;max-width:none;padding-right:0}}
  </style>
  <a href=//www.google.com/><img src=//www.google.com/images/errors/logo_sm.gif alt=Google></a>
  <p><b>400.</b> <ins>That鈥檚 an error.</ins>
  <p>Your client has issued a malformed or illegal request.  <ins>That鈥檚 all we know.</ins>
gle.timers.load.t.iml=e;google.kCSI.imc=c;google.kCSI.imn=b;google.kCSI.imp=d;void 0!==google.stt&&(google.kCSI.stt=google.stt);google.csiReport&&google.csiReport()}}window.addEventListener?window.addEventListener("load",n,!1):window.attachEvent&&window.attachEvent("onload",n);google.timers.load.t.prt=e=(new Date).getTime();})();
</script></body></html>
0

HTTP/1.0 400 Bad Request
Content-Type: text/html; charset=UTF-8
Content-Length: 925
Date: Tue, 10 Dec 2013 0
sucess 4
H
回复

使用道具 举报

 楼主| 发表于 2013-12-10 18:15:58 | 显示全部楼层
接上面:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-12-10 18:18:52 | 显示全部楼层
郁闷,欧元符是个神奇的字符打不出来,接上上面:(这里有个欧元符)GHAssertion "p != NULL" failed at line 538 in ..\LWIP\lwip-1.3.2\src\core\pbuf.c
最后一行报错了,而且一个请求返回了三个网页,第一个200后面两个400。请求高手指点指点,是不是tcpcli_recv有问题,该怎么改?
回复 支持 反对

使用道具 举报

发表于 2013-12-10 18:31:54 | 显示全部楼层
这么复杂的问题啊 ,看到就觉得害怕
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-12-10 20:45:27 | 显示全部楼层
万卿月 发表于 2013-12-10 18:31
这么复杂的问题啊 ,看到就觉得害怕

真棒!!非常感谢看看啊,不复杂的就前面几段是代码 ,后面是数据
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-12-10 20:46:08 | 显示全部楼层
火哥,求救啊
回复 支持 反对

使用道具 举报

发表于 2013-12-10 21:07:24 | 显示全部楼层
bbglx 发表于 2013-12-10 18:18
郁闷,欧元符是个神奇的字符打不出来,接上上面:(这里有个欧元符)G HAssertion "p != NULL" failed at l ...

断言 失败,传递进去 的 p 指针为 空 导致断言失败的。

GHAssertion "p != NULL" failed at line 538 in ..\LWIP\lwip-1.3.2\src\core\pbuf.c
回复 支持 反对

使用道具 举报

发表于 2013-12-10 21:09:26 | 显示全部楼层
bbglx 发表于 2013-12-10 20:46
火哥,求救啊

这个 估计得 单步调试,在断言失败的地方配置断点,然后 在调用栈 里面 看看之前执行了什么函数,他们传递进来的 指针值 是否异常(此处 指针 为 0)
回复 支持 反对

使用道具 举报

发表于 2013-12-10 21:10:01 | 显示全部楼层
不调试的话,我也没法 找到原因。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-12-11 13:42:24 | 显示全部楼层
fire 发表于 2013-12-10 21:10
不调试的话,我也没法 找到原因。

谢谢火哥,以太网太复杂了。你帮我看看接收数据这是不是错了,对lwip函数还不是很熟悉:static err_t tcpcli_recv(void *arg, struct tcp_pcb *pcb,struct pbuf *p,err_t err)
        {  
        tcp_recved(pcb, p->tot_len);   //告诉lwip已经处理了数据
        printf(p->payload);   //打印收到数据
        pbuf_free(p);     //释放pbuf结构
        tcp_close(pcb);  //不是说这个函数会删除PCB吗,那么PCB怎么还可以用?

        return ERR_OK;
}
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 10:42 , Processed in 0.029266 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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