请教LWIP中err_t lwip_tcp_event()函数为什么没定义?
<br />最近闲来没事,在看LWIP,是uc/os版本的,在应用程序线程和TCP/IP线程的交互方面,有个疑问,望大家指点迷津:<br />在opt.h中,定义了<br />#ifndef LWIP_EVENT_API<br />#define LWIP_EVENT_API 0<br />#define LWIP_CALLBACK_API 1<br />#else <br />#define LWIP_EVENT_API 1<br />#define LWIP_CALLBACK_API 0<br />#endif <br /><br />也就是说,应用程序应该有两种方式和协议栈通讯, 在tcp.h中,定义了对应于这两种方式的进程间通信宏定义:<br /> <br />#if LWIP_EVENT_API<br /><br />enum lwip_event {<br /> LWIP_EVENT_ACCEPT,<br /> LWIP_EVENT_SENT,<br /> LWIP_EVENT_RECV,<br /> LWIP_EVENT_CONNECTED,<br /> LWIP_EVENT_POLL,<br /> LWIP_EVENT_ERR<br />};<br /><br />err_t lwip_tcp_event(void *arg, struct tcp_pcb *pcb,<br /> enum lwip_event,<br /> struct pbuf *p,<br /> u16_t size,<br /> err_t err);<br /><br />#define TCP_EVENT_ACCEPT(pcb,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),<br /> LWIP_EVENT_ACCEPT, NULL, 0, err)<br />#define TCP_EVENT_SENT(pcb,space,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),<br /> LWIP_EVENT_SENT, NULL, space, ERR_OK)<br />#define TCP_EVENT_RECV(pcb,p,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),<br /> LWIP_EVENT_RECV, (p), 0, (err))<br />#define TCP_EVENT_CONNECTED(pcb,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),<br /> LWIP_EVENT_CONNECTED, NULL, 0, (err))<br />#define TCP_EVENT_POLL(pcb,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),<br /> LWIP_EVENT_POLL, NULL, 0, ERR_OK)<br />#define TCP_EVENT_ERR(errf,arg,err) lwip_tcp_event((arg), NULL, <br /> LWIP_EVENT_ERR, NULL, 0, (err))<br />#else /* LWIP_EVENT_API */<br />#define TCP_EVENT_ACCEPT(pcb,err,ret) <br /> if((pcb)->accept != NULL) <br /> (ret = (pcb)->accept((pcb)->callback_arg,(pcb),(err)))<br />#define TCP_EVENT_SENT(pcb,space,ret) <br /> if((pcb)->sent != NULL) <br /> (ret = (pcb)->sent((pcb)->callback_arg,(pcb),(space)))<br />#define TCP_EVENT_RECV(pcb,p,err,ret) <br /> if((pcb)->recv != NULL) <br /> { ret = (pcb)->recv((pcb)->callback_arg,(pcb),(p),(err)); } else { <br /> if (p) pbuf_free(p); }<br />#define TCP_EVENT_CONNECTED(pcb,err,ret) <br /> if((pcb)->connected != NULL) <br /> (ret = (pcb)->connected((pcb)->callback_arg,(pcb),(err)))<br />#define TCP_EVENT_POLL(pcb,ret) <br /> if((pcb)->poll != NULL) <br /> (ret = (pcb)->poll((pcb)->callback_arg,(pcb)))<br />#define TCP_EVENT_ERR(errf,arg,err) <br /> if((errf) != NULL) <br /> (errf)((arg),(err))<br />#endif /* LWIP_EVENT_API */ <br /><br /><br />可是,我在整个工程程序中,找不到:<br />err_t lwip_tcp_event(void *arg, struct tcp_pcb *pcb,<br /> enum lwip_event,<br /> struct pbuf *p,<br /> u16_t size,<br /> err_t err);<br />函数的实现在什么地方,望各位给点思路?<br /> 这个叫做callback
被协议栈调用,由应用实现。应用程序就在这个函数里处理这些事件。谢谢楼上
楼上的意思就是说它是回调函数了。协议栈已经帮我们定义了宏LWIP_CALLBACK_API<br />下的种种消息处理函数,不知道它又提供LWIP_EVENT_API这样的接口,意义何在?lwip有两种工作模式
不带OS时采用回调函数的方式<br />带OS时采用事件驱动方式<br />www.armecos.com自助商城有详细文档图片讲解lwip架构。妄测
谢过armecos,你的商城我去过了啊!<br />总结上面两位的高见:我妄测:<br /><br />LWIP_EVENT_API:从宏名来看,应对应于事件驱动(带操作系统),其实是对应于不带操作系统下的回调函数,函数<br />err_t lwip_tcp_event(void *arg, struct tcp_pcb *pcb,<br /> enum lwip_event,<br /> struct pbuf *p,<br /> u16_t size,<br /> err_t err);<br />就是用户自己要完成编写的回调函数;<br /><br />LWIP_CALLBACK_API:从宏名来看,应对应于回调函数驱动(不带操作系统),其实却是带操作系统下的事件驱动方式。<br /><br /><br />对LWIP结构没搞通,暂时这么理解吧,等搞清了再发! 自己琢磨太慢,资料里有彩图,一看便知。
页:
[1]