我奔向月亮而去 2024-02-06 09:07 采纳率: 0%
浏览 62

嵌入式 LWIP TCP客户端,一段时间后接收不到数据

参考:https://bbs.21ic.com/icview-990420-1-1.html
在回调函数中调用tcp_recved()函数后解决。

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-02-06 09:08
    关注

    引自免费微信小程序:皆我百晓生

    在嵌入式系统中使用LWIP实现TCP客户端时,遇到一段时间后接收不到数据的问题,这可能与TCP窗口管理有关。LWIP的TCP协议栈需要通过调用tcp_recved()函数来更新接收窗口大小,以便发送端可以继续发送数据。

    tcp_recved()函数的作用是通知LWIP已经从应用层成功处理了相应数量的数据,并且有更多的缓冲区空间可以接收新的数据。如果不对已接收的数据进行确认,TCP接收窗口可能会填满,导致发送端停止发送更多的数据,从而出现看似接收不到数据的现象。

    解决这个问题的方法是在收到TCP数据并将其传递给上层应用之后,立即调用tcp_recved()函数,如下所示:

    err_t tcp_data_received(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err) {
        // 假设你已经在应用层正确处理了接收到的数据
        // ...处理pbuf中的数据...
    
        // 更新接收窗口大小,参数为已处理的数据字节数
        tcp_recved(tpcb, p->tot_len);
    
        return ERR_OK;
    }
    
    // 注册回调函数
    tcp_recv(tcp_client_pcb, tcp_data_received);
    

    在这个示例中,tcp_data_received是你注册到TCP连接(tcp_client_pcb)上的接收回调函数,当有数据到达时LWIP会调用它。p->tot_len表示当前接收到的数据包pbuf的总长度。

    参考链接:

    请注意,在实际应用中,请根据你的具体代码逻辑调整和补充错误处理部分。同时确保在处理完每个pbuf的所有数据后才调用tcp_recved()

    评论

报告相同问题?

问题事件

  • 创建了问题 2月6日

悬赏问题

  • ¥15 而使用UE5引擎的 工具选项里 打开c++ visual studio 就会有部分显示加载失败 如图 加载失败的这张图 请问是什么原因
  • ¥15 mysql 对多个字段模糊查询,返回第一个匹配的字段
  • ¥15 the testing results of the whole dataset is empty
  • ¥15 can问题,往哥解决
  • ¥15 FFmpeg 成功推流到 Nginx RTMP 服务器但无法用 ffplay 或 VLC 播放
  • ¥15 请修改以下C语言代码使其能正确输出最短路径
  • ¥20 抖音商城拉码器安卓报错求解决办法或者有新的拉码脚本也可以介绍一下
  • ¥15 MPLAB IDE V2.35 报错make[2]: *** [build/default/production/_ext/1472/MSSP_I2C.p1] Error 1
  • ¥15 新唐M451 DTMF检测和发送代码修改
  • ¥15 在国外文献网站里点击view pdf 加载异常缓慢甚至加载不出来。