LWIP 回调函数

void udp_recv(struct udp_pcb *pcb,void (* recv)(void *arg, struct udp_pcb *upcb, struct pbuf *p,struct ip_addr *addr, u16_t port),void *recv_arg)
{
  pcb->recv = recv;    //recv为函数指针
  pcb->recv_arg = recv_arg;
}

static void udpapp_recv_callback(void *arg, struct udp_pcb *upcb, struct pbuf *pkt_buf, struct ip_addr *addr, u16_t port)  //回调函数
{
  。。。。自己代码
}
 
void main(void)
{
 
 udp_recv(udpapp_pcb, udpapp_recv_callback, NULL);   //初始化将回调函数赋值给一个函数指针
 
while(1)
{
     if(收到UDP包)
     {
       ........ //系统代码
        pcb->recv(pcb->recv_arg, pcb, p, &iphdr->src, src);   //函数指针被系统自己调用
       .........//系统代码
     }
}
 
}

看到这里大家会疑问,何必这复杂,直接搞一个子函数给系统调用,子函数给程序员不就得了。。。。
因为上面代码是只建立了一个UDP连接,如果建立多个UDP连接呢,每个UDP的连接对应不同的子函数处理。这样就需要通过函数指针变量实现。LWIP就是通过链表方式建立多个UDP连接,每个连接对应一个函数指针,每个函数指针对应一个子函数。

struct udp_pcb {

  struct udp_pcb *next;

  void (* recv)(void *arg, struct udp_pcb *pcb, struct pbuf *p,struct ip_addr *addr, u16_t port);
  
};

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值