您的位置:首页 > 游戏 > 游戏 > 100部看黄禁用免费入口_设计动漫的软件_湖南最新消息今天_长岭网站优化公司

100部看黄禁用免费入口_设计动漫的软件_湖南最新消息今天_长岭网站优化公司

2025/5/10 7:10:59 来源:https://blog.csdn.net/bifudoph/article/details/146402238  浏览:    关键词:100部看黄禁用免费入口_设计动漫的软件_湖南最新消息今天_长岭网站优化公司
100部看黄禁用免费入口_设计动漫的软件_湖南最新消息今天_长岭网站优化公司

在LwIP中,tcp_recved()tcp_sndbuf()tcp_write() 是TCP协议栈的核心函数,用于管理接收和发送数据流。以下是它们的详细用法及示例:


1. tcp_recved()

功能
  • 通知协议栈已处理接收数据:当应用层从接收缓冲区读取数据后,需调用此函数更新TCP接收窗口(Window Size),允许对端继续发送数据。
  • 流量控制:避免接收缓冲区溢出,确保TCP滑动窗口机制正常工作。
函数原型
void tcp_recved(struct tcp_pcb *pcb, u16_t len);
  • 参数
    • pcb:指向当前TCP连接的tcp_pcb结构体。
    • len:应用层已处理的数据长度(字节)。
  • 调用时机:在接收回调函数(如tcp_recv()注册的回调)中处理完数据后调用。
示例
err_t my_recv_callback(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) {if (p != NULL) {// 处理接收到的数据(例如拷贝到应用缓冲区)process_data(p->payload, p->len);// 通知协议栈已处理数据长度tcp_recved(pcb, p->tot_len);// 释放pbufpbuf_free(p);} else if (err == ERR_OK) {// 对端关闭连接tcp_close(pcb);}return ERR_OK;
}

2. tcp_sndbuf()

功能
  • 获取发送缓冲区剩余空间:返回当前TCP连接发送缓冲区中可用的字节数。
  • 避免发送阻塞:在调用tcp_write()前检查可用空间,防止因缓冲区不足导致写入失败。
函数原型
u16_t tcp_sndbuf(struct tcp_pcb *pcb);
  • 参数
    • pcb:指向当前TCP连接的tcp_pcb结构体。
  • 返回值:发送缓冲区剩余可用字节数。
示例
void send_data(struct tcp_pcb *pcb, const char *data, u16_t len) {// 检查发送缓冲区剩余空间u16_t available = tcp_sndbuf(pcb);if (available < len) {// 空间不足,等待或分片发送len = available;}// 写入数据到发送缓冲区err_t err = tcp_write(pcb, data, len, TCP_WRITE_FLAG_COPY);if (err == ERR_OK) {// 触发数据发送tcp_output(pcb);} else {// 处理错误(如ERR_MEM)}
}

3. tcp_write()

功能
  • 将数据写入发送缓冲区:将应用层数据提交到TCP发送缓冲区,等待协议栈发送。
  • 数据分片:自动根据MSS(最大报文段长度)分片,或通过标志控制立即发送。
函数原型
err_t tcp_write(struct tcp_pcb *pcb, const void *data, u16_t len, u8_t flags);
  • 参数
    • pcb:指向当前TCP连接的tcp_pcb结构体。
    • data:待发送数据的指针。
    • len:数据长度(字节)。
    • flags:控制标志,常用值:
      • TCP_WRITE_FLAG_COPY:复制数据到内部缓冲区(默认推荐)。
      • TCP_WRITE_FLAG_MORE:提示后续还有数据,延迟发送(结合tcp_output()触发)。
  • 返回值
    • ERR_OK:写入成功。
    • ERR_MEM:缓冲区不足。
    • ERR_CONN:连接已关闭。
示例
// 发送HTTP响应
const char *response = "HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\nHello";
u16_t resp_len = strlen(response);// 检查发送缓冲区空间
if (tcp_sndbuf(pcb) >= resp_len) {// 写入数据并立即发送err_t err = tcp_write(pcb, response, resp_len, TCP_WRITE_FLAG_COPY);if (err == ERR_OK) {tcp_output(pcb); // 立即发送数据}
}

三函数协作流程

  1. 接收数据
    • tcp_recv()回调中处理数据 → 调用tcp_recved()更新窗口。
  2. 发送数据
    • 调用tcp_sndbuf()检查空间 → 调用tcp_write()写入数据 → 调用tcp_output()触发发送。

常见问题与解决

1. 数据发送不出去
  • 原因:未调用tcp_output(),数据滞留在缓冲区。
  • 解决:写入后显式调用tcp_output()或使用TCP_WRITE_FLAG_MORE标志。
2. 接收端停滞
  • 原因:未调用tcp_recved(),接收窗口未更新。
  • 解决:处理完数据后立即调用tcp_recved()
3. 发送返回ERR_MEM
  • 原因:发送缓冲区满。
  • 解决:分片发送或注册tcp_sent()回调,在缓冲区空闲时重试。

完整示例(TCP Echo服务器)

err_t echo_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) {if (p != NULL) {// 回传接收到的数据tcp_write(pcb, p->payload, p->len, TCP_WRITE_FLAG_COPY);tcp_output(pcb);// 通知协议栈已处理数据tcp_recved(pcb, p->len);pbuf_free(p);} else if (err == ERR_OK) {tcp_close(pcb);}return ERR_OK;
}// 初始化TCP服务器
void tcp_server_init() {struct tcp_pcb *pcb = tcp_new();tcp_bind(pcb, IP_ADDR_ANY, 8080);tcp_listen(pcb);tcp_accept(pcb, [](void *arg, struct tcp_pcb *newpcb, err_t err) {tcp_recv(newpcb, echo_recv);return ERR_OK;});
}

通过合理使用这三个函数,可以确保LwIP TCP通信的稳定性和效率。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com