一。LWIP数据包消息处理
1.接受数据包
2.构造消息
3.投递消息
4.获取消息
5.处理数据包
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;