DEMO
//
// Created by shchl on 2024/3/8.
//
#include <string.h>
#include "main.h"
#include "lwip/udp.h"
#include "FreeRTOS.h"
#include "task.h"
void udp_task_run(void *args);
static TaskHandle_t upd_handle;
void create_udp_thread() {
xTaskCreate((TaskFunction_t) udp_task_run,
(const char *) "udp_task",
(uint16_t) 256,
(void *) NULL,
(UBaseType_t) 10,
(TaskHandle_t *) &upd_handle);
}
static void udp_demo_callback(void *arg,
struct udp_pcb *upcb,
struct pbuf *p,
const ip_addr_t *addr,
u16_t port) {
struct pbuf *q = NULL;
// todo 业务逻辑
udp_send(upcb, p);
printf("接收来自远端:%s", (char *) p->payload);
pbuf_free(p);
}
static char *st_buffer = "We get a data\n";
extern struct netif g_lwip_netif;
void udp_task_run(void *arg) {
struct pbuf *q;
struct udp_pcb *udpecho_pcb;
/*创建一个pbuf数据包*/
/* 新建一个控制块*/
udpecho_pcb = udp_new();
/*设置远端连接信息*/
udpecho_pcb->remote_port = 8080;
IP4_ADDR(&udpecho_pcb->remote_ip, 192, 168, 8, 2);
/* 绑定本地端口号 */
udp_bind(udpecho_pcb, &g_lwip_netif.ip_addr, 8000);
/* 注册接收数据回调函数 */
udp_recv(udpecho_pcb, udp_demo_callback, (void *) st_buffer);
int ttl = 0;
while (1) {
while (ttl > 100) {
q = pbuf_alloc(PBUF_TRANSPORT, strlen(st_buffer), PBUF_POOL);
pbuf_take(q, st_buffer, strlen(st_buffer));
udp_send(udpecho_pcb, q);
pbuf_free(q);
ttl = 0;
}
ttl++;
vTaskDelay(10);
}
}
结果
lwip是怎么调用到udp的回调流程