打印
[牛人杂谈]

LWIP 回调函数

[复制链接]
1191|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huangcunxiake|  楼主 | 2016-3-25 11:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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);   //函数指针被系统自己调用
       .........//系统代码
     }
}

}

沙发
huangcunxiake|  楼主 | 2016-3-25 11:14 | 只看该作者
看到这里大家会疑问,何必这复杂,直接搞一个子函数给系统调用,子函数给程序员不就得了。。。。
因为上面代码是只建立了一个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);
  
};


使用特权

评论回复
板凳
dentsgot| | 2016-3-26 23:16 | 只看该作者
这个是用于网络的吧,轻型的

使用特权

评论回复
地板
huangcunxiake|  楼主 | 2016-3-30 13:57 | 只看该作者
LwIP是Light Weight (轻型)IP协议,有无操作系统的支持都可以运行。LwIP实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用,它只需十几KB的RAM和40K左右的ROM就可以运行,这使LwIP协议栈适合在低端的嵌入式系统中使用。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

198

主题

3460

帖子

10

粉丝