OpenEdv-开源电子网

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

关于webserver传输文件,接收数据不完整的问题

[复制链接]

1

主题

3

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2018-8-23
在线时间
5 小时
发表于 2018-8-28 13:54:06 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 angly 于 2018-8-28 13:53 编辑

问题描述:      最近做了一个webserver,用来接收网页发送过来的文件数据。发现如果传输稍微大一点的文件,如40K,只能收前6、7k左右的数据,然后就没有反应了。
      用wireshake抓包,出现问题如下图所示。初以为是MEM_SIZE的问题,从6*1024改为10*1024,大概能接收10K左右,比以前多了一些,以为是内存释放问题,但是在调试模式下,跟踪pbuf(PUBF_POOL_BUFSIZE为1536,足够接收每一帧数据),发现每次pbuf都能被释放。接收每一帧时,pbuf指针不会变,payload内容会变,说明pbuf释放也没问题。
      我是在http_recv函数是做的post文件接收处理,每一帧数据接收完毕后,会释放pbuf,然后返回err_ok,下次调用此函数时,会先执行tcp_recved接收确认,也就是应答。应该不会出现什么问题。
      现在找不出问题来源,所以请求各位大神帮忙解答一下,不胜感激。


捕获.PNG
注:192.168.1.13为pc端,192.168.1.30为stm32f103板



最佳答案

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

问题已解决! 之前用的是TCP_DEBUG,后来我又打开HTTPD_DEBUG,发现输出了一条信息:http_poll: too many retries, close 输出这条信息后,才开始关闭tcp连接的。 查找源代码发现,这是在http_poll函数中发生的,这个函数,每2秒调用一次,8秒内如果没有数据传输的话,就关闭。其中关键参数是 hs->retries!这个参数累加到4,就会执行关闭连接。 参考其他的官方代码,发现每次有数据传输,send或recv,都会重置retries为0;查看 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2018-8-23
在线时间
5 小时
 楼主| 发表于 2018-8-28 13:54:07 | 显示全部楼层
问题已解决!
之前用的是TCP_DEBUG,后来我又打开HTTPD_DEBUG,发现输出了一条信息:http_poll: too many retries, close 输出这条信息后,才开始关闭tcp连接的。
查找源代码发现,这是在http_poll函数中发生的,这个函数,每2秒调用一次,8秒内如果没有数据传输的话,就关闭。其中关键参数是 hs->retries!这个参数累加到4,就会执行关闭连接。
参考其他的官方代码,发现每次有数据传输,send或recv,都会重置retries为0;查看自己写的代码,虽然每帧数据都有接收并处理,但是没有重置retries,导致系统认为是空闲链接,从而超时后自动关闭!
[mw_shl_code=c,true]/**
* The poll function is called every 2nd second.
* If there has been no data sent (which resets the retries) in 8 seconds, close.
* If the last portion of a file has not been sent in 2 seconds, close.
*
* This could be increased, but we don't want to waste resources for bad connections.
*/
static err_t http_poll(void *arg, struct tcp_pcb *pcb)
{
  struct http_state *hs = (struct http_state *)arg;
  LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("http_poll: pcb=%p hs=%p pcb_state=%s\n",
    (void*)pcb, (void*)hs, tcp_debug_state_str(pcb->state)));

  if (hs == NULL) {
    /* arg is null, close. */
    LWIP_DEBUGF(HTTPD_DEBUG, ("http_poll: arg is NULL, close\n"));
    http_close_conn(pcb, hs);
    return ERR_OK;
  } else {
    hs->retries++;
    if (hs->retries == HTTPD_MAX_RETRIES) {
      LWIP_DEBUGF(HTTPD_DEBUG, ("http_poll: too many retries, close\n"));
      http_close_conn(pcb, hs);
      return ERR_OK;
    }

    /* If this connection has a file open, try to send some more data. If
     * it has not yet received a GET request, don't do this since it will
     * cause the connection to close immediately. */
    if(hs && (hs->handle)) {
      LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("http_poll: try to send more data\n"));
      if(http_send_data(pcb, hs)) {
        /* If we wrote anything to be sent, go ahead and send it now. */
        LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("tcp_output\n"));
        tcp_output(pcb);
      }
    }
  }

  return ERR_OK;
}[/mw_shl_code]
回复

使用道具 举报

117

主题

598

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
1702
金钱
1702
注册时间
2012-5-10
在线时间
439 小时
发表于 2018-8-28 16:48:42 | 显示全部楼层
while(ERR_OK == netconn_recv(httpBuffer->clientconn, &httpBuffer->tcpRecvBuf))
        {
                httpBuffer->recvDataLen += netbuf_copy(httpBuffer->tcpRecvBuf, httpBuffer->recvBuf + httpBuffer->recvDataLen ,
                        HttpRecvBufLen - httpBuffer->recvDataLen);
               
                netbuf_delete(httpBuffer->tcpRecvBuf);
        }
如有技术问题,微信扫头像交流,STM32,JAVA,服务器
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2018-8-23
在线时间
5 小时
 楼主| 发表于 2018-8-30 11:55:11 | 显示全部楼层
通过wireshare发现,每次都是web服务器主动发送FIN标志断开连接,导致数据传输中断,利用LWIP_DEBUG输出如下,问题出现在出现四次polling application后,就会出现关闭tcp的信息,具体问题还没找到
3.PNG
回复

使用道具 举报

头像被屏蔽

0

主题

6

帖子

0

精华

禁止访问

积分
5
金钱
5
注册时间
2018-8-30
在线时间
0 小时
发表于 2018-8-30 16:29:02 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 11:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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