硬汉嵌入式论坛

 找回密码
 立即注册
查看: 535|回复: 3
收起左侧

lwip通过tcp上传挂载的U盘文件,不用ftp

[复制链接]

11

主题

36

回帖

69

积分

初级会员

积分
69
发表于 2023-10-25 10:03:36 | 显示全部楼层 |阅读模式
lwip通过tcp上传挂载的U盘文件,不用ftp

有好的方式么

我目前想到的是emmc读取,tcp进行分包上传
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
发表于 2023-10-25 15:44:19 | 显示全部楼层
TFTP也可以,TCP,UDP都可以。
回复

使用道具 举报

11

主题

36

回帖

69

积分

初级会员

积分
69
 楼主| 发表于 2023-10-27 16:24:11 | 显示全部楼层
eric2013 发表于 2023-10-25 15:44
TFTP也可以,TCP,UDP都可以。

不允许用FTP 只能HTTP POST请求
我的方案是分包上传
但是发现tcp_write里面TCP_SND_BUF 默认是2*TCP_MSS, 而TCP_MSS默认536,最大1426
也就是TCP_SND_BUF最大2852,这个可以调大么。
另外网上有个方案 我进行了调整
[C] 纯文本查看 复制代码
err_t tcp_client_senddata(uint8_t *send_buf, int size)
{
  int try_time = 0;  
  int send_pack_index = 0;  
  if(size == 0)
    return 0;  
  err_t err_status;  
  int sizemax = TCP_SND_BUF - 20;  // 这里实际最大TCP_SND_BUF ,保守-20
  
  send_pack:  
  if(try_time >= 10) 
  {
    return -1;
  }
  
  if(size == 0)
    return 0;
  
  if(size <= sizemax) 
  {
    err_status = tcp_write(cg_tcp_pcb, &send_buf[send_pack_index * sizemax], size, 1);
    
    if(err_status != ERR_OK)
    {
      if(err_status == ERR_MEM)
      {        
        // printf("TCP发送失败!数据太长%u\n", size);
        HAL_Delay(5);
        try_time ++;
        goto send_pack;
      } 
      else 
      {
        printf("TCP发送失败!\n");
        //tcp_err(cg_tcp_pcb, client_err);   
      }
      return -1;
    }
    
    //立刻发送
    if(tcp_output(cg_tcp_pcb) != ERR_OK) 
    {
      printf("TCP发送失败!\n");
      return -1;  
    }   
    return 0;
  }
  else 
  {
    // printf("数据大于sizemax,分包发送! %u\n",send_pack_index);    
    err_status = tcp_write(cg_tcp_pcb, &send_buf[send_pack_index * sizemax], sizemax, 1);      
    if(err_status != ERR_OK) 
    {
      if(err_status == ERR_MEM) 
      {
        // printf("TCP发送失败!数据太长%u\n",size);
        HAL_Delay(5);
        try_time ++;
        goto send_pack;
      }
      else 
      {
        printf("TCP发送失败!\n");
        //tcp_err(cg_tcp_pcb, client_err);   
      }
      return -1;
    }
    
    //立刻发送
    if(tcp_output(cg_tcp_pcb) != ERR_OK) 
    {
      // printf("TCP发送失败!\n");
      return -1;  
    }
  
    try_time = 0;
    size -= sizemax;
	  // printf("发送完成! 剩余 %u 字节需要发送\n",size);      
    send_pack_index ++;      
    goto send_pack;
  }
}


这样这边分包发送倒是不报错,但是服务器那边接收不到
报错Processing of multipart/form-data request failed. Unexpected EOF read on the socket
像是只读到第一个包就结束了 然后判断没有正常结束就返回异常了。

是哪里写的有问题么
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
发表于 2023-10-28 08:57:29 | 显示全部楼层
LinY 发表于 2023-10-27 16:24
不允许用FTP 只能HTTP POST请求
我的方案是分包上传
但是发现tcp_write里面TCP_SND_BUF 默认是2*TCP_MS ...


HTTP的话,我做过一个Web挂载SD卡文件浏览和上传功能,可以直接下载SD卡的文件。

https://www.armbbs.cn/forum.php? ... &extra=page%3D1

QQ截图20231028085900.png
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-5 21:57 , Processed in 0.220450 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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