新手入门
- 积分
- 11
- 金钱
- 11
- 注册时间
- 2022-7-13
- 在线时间
- 4 小时
|
发表于 2025-12-3 08:45:10
|
显示全部楼层
这个问题居然这么久没人回答,最近项目要用到LWIP,移植了正点原子的标准库例程。也同样遇到了相同的问题,tcp_server_flag置位到轮询发送清位,大概需要500毫秒时间。这样的发送方式,确实实用性不强。我是这样解决的:
1、在tcp_server_demo.c文件里定义全局变量:struct tcp_pcb *my_tcp_pcb;//用来缓存accept时候tcp的全局变量
2、在tcp_server_demo.c文件的err_t tcp_server_accept(void *arg,struct tcp_pcb *newpcb,err_t err)函数里,tcp_arg(newpcb,es);这一行的下面,添加一行:my_tcp_pcb=newpcb;
3、在tcp_server_demo.c文件里新建一个立即发送的函数:
err_t tcp_immediate_send(void)
{
err_t err = ERR_OK;
struct pbuf *p = NULL;
// 1. 检查连接有效性(必须是已建立状态)
if (my_tcp_pcb == NULL || my_tcp_pcb->state != ESTABLISHED) {
return ERR_CONN; // 连接无效或已断开
}
// 2. 分配 PBUF(TCP 数据需用 PBUF_TRANSPORT 层级)
// PBUF_RAM:数据存于RAM,可直接修改;PBUF_POOL:从内存池分配(更省内存)
p = pbuf_alloc(PBUF_TRANSPORT,strlen((char*)tcp_server_sendbuf),PBUF_POOL);
if (p == NULL) {
return ERR_MEM; // 内存不足,分配失败
}
// 3. 将待发送数据复制到 PBUF 中
// pbuf_take 会自动处理 PBUF 链(若数据超长,无需手动拆分)
if (pbuf_take(p, (char*)tcp_server_sendbuf,strlen((char*)tcp_server_sendbuf)) != ERR_OK) {
pbuf_free(p); // 复制失败,释放 PBUF
return ERR_BUF;
}
// 4. 写入 TCP 发送缓冲区(tcp_write)
// 第三个参数 flags:0=普通发送;TCP_WRITE_FLAG_MORE=后续还有数据(用于批量发送)
err = tcp_write(my_tcp_pcb, p, strlen((char*)tcp_server_sendbuf), 0);
if (err != ERR_OK) {
pbuf_free(p); // 写入失败,释放 PBUF
return err;
}
// 5. 强制触发发送(关键!tcp_output 跳过默认超时,立即发送)
tcp_output(my_tcp_pcb);
// 6. 释放 PBUF(因未使用 TCP_WRITE_FLAG_COPY,LWIP 已复制数据到自身缓冲区)
// 若用 TCP_WRITE_FLAG_COPY,可省略此步(但 pbuf_take 仍需执行)
pbuf_free(p);
return ERR_OK;
}
4、在在tcp_server_demo.h文件里添加一行:err_t tcp_immediate_send(void);
5、在需要发送的地方添加头头文件#include "tcp_server_demo.h",直接调用tcp_immediate_send函数即可。
备注:重点是struct tcp_pcb *my_tcp_pcb;的获取,需要发送的数据提前缓存到tcp_server_sendbuf里。
|
|