RAW/Callback API

是指内核回调型的 API,这在许多通信协议的 C 语言实现中都有所应用。

你新建了一个 TCP 或者 UDP 的连接,你想等它接收到数据以后去处理它们,这时你需要把处理该数据的操作封装成一个函数,然后将这个函数的指针注册到LwIP 内核中。

LwIP 内核会在需要的时候去检测该连接是否收到数据,如果收到了数据,内核会在第一时间调用注册的函数,这个过程被称为“回调”,这个注册函数被称为“回调函数”。

NETCONN API

SOCKET API

  1. struct netbuf
  2. {
  3. truct pbuf *p, *ptr;
  4. ip_addr_t addr;
  5. u16_t port;
  6. }
p和ptr 看出netbuf真正保存数据的地方是指针p指向的pbuf链表 ,ptr也指向该pbuf链表,
p和ptr不同的是:p一直指向链表的第一个pbuf,而ptr则不同,ptr可以指向链表中的其他位置。
addr和port 这两个字段分别记录数据发送方的IP地址和端口号。

image.png

  1. netbuf_new()
  2. netbuf_delete()
  3. netbuf_alloc()
  4. netbuf_free()
  5. netbuf_ref()
  6. netbuf_chain()
  7. netbuf_data()
  8. netbuf_next()
  9. netbuf_first()

在使用NETCONN接口的时候不管你是UDP还是TCP统一使用一个连接结构—netconn,这样应用程序就可以忽略掉连接类型的差异,使用统一的连接结构和编程函数,在api.h中定义了netconn结构体。

  1. struct netonn
  2. {
  3. enum netconn_type type;
  4. enum netconn_state state;
  5. union{
  6. struct ip_pcb *ip;
  7. struct tcp_pcb *tcp;
  8. struct udp_pcb *udp;
  9. struct raw_pcb *raw;
  10. } pcb;
  11. err_t last_err;
  12. sys_sem_t op_completed;
  13. …….
  14. }
  1. netconn_new() 此函数为一个宏
  2. netconn_delete()
  3. netconn_getaddr()
  4. netconn_bind()
  5. netconn_connect()
  6. netconn_disconnect()
  7. netconn_listen() 此函数为一个宏
  8. netconn_accept()
  9. netconn_recv()
  10. netconn_send()
  11. netconn_write() 此函数为一个宏
  12. netconn_close()