12.物联网LWIP之消息处理机制,lwip消息传递机制

一。LWIP数据包消息处理

12.物联网LWIP之消息处理机制,lwip消息传递机制_第1张图片

1.接受数据包

2.构造消息

3.投递消息

4.获取消息

5.处理数据包

12.物联网LWIP之消息处理机制,lwip消息传递机制_第2张图片

api_msg

这个结构体包括执行函数所必需的一切,对于另一个线程上下文中的netconn(主要用于处理netconn)在tcpip_thread上下文中(线程安全)。

struct api_msg {
  /* 大家可以理解为是一个socket,这个接口要表示很多信息,用一个结构体进行封装 */
  struct netconn *conn;
  /** 消息处理函数的返回值 */
  err_t err;
  /** Depending on the executed function, one of these union members is used */
  union {
    /** 用于网络数据发送 ---- write */
    struct netbuf *b;
    /** 相当于sockket */
    struct {
      u8_t proto;
    } n;
    /** 
    
        bind
        connect
    */
    struct {
      API_MSG_M_DEF_C(ip_addr_t, ipaddr);
      u16_t port;
    } bc;
    /** 获取IP地址,acpect,会返回我们客户端的IP地址以及端口号*/
    struct {
      ip_addr_t API_MSG_M_DEF(ipaddr);
      u16_t API_MSG_M_DEF(port);
      u8_t local;
    } ad;
    /** write */
    struct {
      const void *dataptr;
      size_t len;
      u8_t apiflags;
#if LWIP_SO_SNDTIMEO
      u32_t time_started;
#endif /* LWIP_SO_SNDTIMEO */
    } w;
    /** read*/
    struct {
      u32_t len;
    } r;
#if LWIP_TCP
    /** 
        close
        shutdown
    */
    struct {
      u8_t shut;
#if LWIP_SO_SNDTIMEO || LWIP_SO_LINGER
      u32_t time_started;
#else /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */
      u8_t polls_left;
#endif /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */
    } sd;
#endif /* LWIP_TCP */
#if LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD)
    /** IGMP */
    struct {
      API_MSG_M_DEF_C(ip_addr_t, multiaddr);
      API_MSG_M_DEF_C(ip_addr_t, netif_addr);
      enum netconn_igmp join_or_leave;
    } jl;
#endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */
// listen(fd, 5)
#if TCP_LISTEN_BACKLOG
    struct {
      u8_t backlog;
    } lb;
#endif /* TCP_LISTEN_BACKLOG */
  } msg;

你可能感兴趣的:(物联网)