LinY 发表于 2023-10-25 10:03:36

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

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

有好的方式么

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

eric2013 发表于 2023-10-25 15:44:19

TFTP也可以,TCP,UDP都可以。

LinY 发表于 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,这个可以调大么。
另外网上有个方案 我进行了调整
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, 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, 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
像是只读到第一个包就结束了 然后判断没有正常结束就返回异常了。

是哪里写的有问题么

eric2013 发表于 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?mod=viewthread&tid=17330&extra=page%3D1

页: [1]
查看完整版本: lwip通过tcp上传挂载的U盘文件,不用ftp