yanyunsong 发表于 2007-10-26 09:38

请教LWIP中err_t lwip_tcp_event()函数为什么没定义?

<br />最近闲来没事,在看LWIP,是uc/os版本的,在应用程序线程和TCP/IP线程的交互方面,有个疑问,望大家指点迷津:<br />在opt.h中,定义了<br />#ifndef&nbsp;LWIP_EVENT_API<br />#define&nbsp;LWIP_EVENT_API&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br />#define&nbsp;LWIP_CALLBACK_API&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1<br />#else&nbsp;<br />#define&nbsp;LWIP_EVENT_API&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1<br />#define&nbsp;LWIP_CALLBACK_API&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br />#endif&nbsp;<br /><br />也就是说,应用程序应该有两种方式和协议栈通讯,&nbsp;在tcp.h中,定义了对应于这两种方式的进程间通信宏定义:<br />&nbsp;<br />#if&nbsp;LWIP_EVENT_API<br /><br />enum&nbsp;lwip_event&nbsp;{<br />&nbsp;&nbsp;LWIP_EVENT_ACCEPT,<br />&nbsp;&nbsp;LWIP_EVENT_SENT,<br />&nbsp;&nbsp;LWIP_EVENT_RECV,<br />&nbsp;&nbsp;LWIP_EVENT_CONNECTED,<br />&nbsp;&nbsp;LWIP_EVENT_POLL,<br />&nbsp;&nbsp;LWIP_EVENT_ERR<br />};<br /><br />err_t&nbsp;lwip_tcp_event(void&nbsp;*arg,&nbsp;struct&nbsp;tcp_pcb&nbsp;*pcb,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enum&nbsp;lwip_event,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;pbuf&nbsp;*p,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u16_t&nbsp;size,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err_t&nbsp;err);<br /><br />#define&nbsp;TCP_EVENT_ACCEPT(pcb,err,ret)&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;lwip_tcp_event((pcb)-&gtcallback_arg,&nbsp;(pcb),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LWIP_EVENT_ACCEPT,&nbsp;NULL,&nbsp;0,&nbsp;err)<br />#define&nbsp;TCP_EVENT_SENT(pcb,space,ret)&nbsp;ret&nbsp;=&nbsp;lwip_tcp_event((pcb)-&gtcallback_arg,&nbsp;(pcb),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LWIP_EVENT_SENT,&nbsp;NULL,&nbsp;space,&nbsp;ERR_OK)<br />#define&nbsp;TCP_EVENT_RECV(pcb,p,err,ret)&nbsp;ret&nbsp;=&nbsp;lwip_tcp_event((pcb)-&gtcallback_arg,&nbsp;(pcb),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LWIP_EVENT_RECV,&nbsp;(p),&nbsp;0,&nbsp;(err))<br />#define&nbsp;TCP_EVENT_CONNECTED(pcb,err,ret)&nbsp;ret&nbsp;=&nbsp;lwip_tcp_event((pcb)-&gtcallback_arg,&nbsp;(pcb),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LWIP_EVENT_CONNECTED,&nbsp;NULL,&nbsp;0,&nbsp;(err))<br />#define&nbsp;TCP_EVENT_POLL(pcb,ret)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;lwip_tcp_event((pcb)-&gtcallback_arg,&nbsp;(pcb),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LWIP_EVENT_POLL,&nbsp;NULL,&nbsp;0,&nbsp;ERR_OK)<br />#define&nbsp;TCP_EVENT_ERR(errf,arg,err)&nbsp;&nbsp;lwip_tcp_event((arg),&nbsp;NULL,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LWIP_EVENT_ERR,&nbsp;NULL,&nbsp;0,&nbsp;(err))<br />#else&nbsp;/*&nbsp;LWIP_EVENT_API&nbsp;*/<br />#define&nbsp;TCP_EVENT_ACCEPT(pcb,err,ret)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((pcb)-&gtaccept&nbsp;!=&nbsp;NULL)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ret&nbsp;=&nbsp;(pcb)-&gtaccept((pcb)-&gtcallback_arg,(pcb),(err)))<br />#define&nbsp;TCP_EVENT_SENT(pcb,space,ret)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((pcb)-&gtsent&nbsp;!=&nbsp;NULL)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ret&nbsp;=&nbsp;(pcb)-&gtsent((pcb)-&gtcallback_arg,(pcb),(space)))<br />#define&nbsp;TCP_EVENT_RECV(pcb,p,err,ret)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((pcb)-&gtrecv&nbsp;!=&nbsp;NULL)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;ret&nbsp;=&nbsp;(pcb)-&gtrecv((pcb)-&gtcallback_arg,(pcb),(p),(err));&nbsp;}&nbsp;else&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(p)&nbsp;pbuf_free(p);&nbsp;}<br />#define&nbsp;TCP_EVENT_CONNECTED(pcb,err,ret)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((pcb)-&gtconnected&nbsp;!=&nbsp;NULL)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ret&nbsp;=&nbsp;(pcb)-&gtconnected((pcb)-&gtcallback_arg,(pcb),(err)))<br />#define&nbsp;TCP_EVENT_POLL(pcb,ret)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((pcb)-&gtpoll&nbsp;!=&nbsp;NULL)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ret&nbsp;=&nbsp;(pcb)-&gtpoll((pcb)-&gtcallback_arg,(pcb)))<br />#define&nbsp;TCP_EVENT_ERR(errf,arg,err)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((errf)&nbsp;!=&nbsp;NULL)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(errf)((arg),(err))<br />#endif&nbsp;/*&nbsp;LWIP_EVENT_API&nbsp;*/&nbsp;<br /><br /><br />可是,我在整个工程程序中,找不到:<br />err_t&nbsp;lwip_tcp_event(void&nbsp;*arg,&nbsp;struct&nbsp;tcp_pcb&nbsp;*pcb,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enum&nbsp;lwip_event,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;pbuf&nbsp;*p,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u16_t&nbsp;size,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err_t&nbsp;err);<br />函数的实现在什么地方,望各位给点思路?<br />&nbsp;

dld2 发表于 2007-10-26 09:57

这个叫做callback

被协议栈调用,由应用实现。应用程序就在这个函数里处理这些事件。

yanyunsong 发表于 2007-10-26 10:06

谢谢楼上

楼上的意思就是说它是回调函数了。协议栈已经帮我们定义了宏LWIP_CALLBACK_API<br />下的种种消息处理函数,不知道它又提供LWIP_EVENT_API这样的接口,意义何在?

armecos 发表于 2007-10-26 10:49

lwip有两种工作模式

不带OS时采用回调函数的方式<br />带OS时采用事件驱动方式<br />www.armecos.com自助商城有详细文档图片讲解lwip架构。

yanyunsong 发表于 2007-10-26 11:16

妄测

谢过armecos,你的商城我去过了啊!<br />总结上面两位的高见:我妄测:<br /><br />LWIP_EVENT_API:从宏名来看,应对应于事件驱动(带操作系统),其实是对应于不带操作系统下的回调函数,函数<br />err_t&nbsp;lwip_tcp_event(void&nbsp;*arg,&nbsp;struct&nbsp;tcp_pcb&nbsp;*pcb,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enum&nbsp;lwip_event,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;pbuf&nbsp;*p,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u16_t&nbsp;size,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err_t&nbsp;err);<br />就是用户自己要完成编写的回调函数;<br /><br />LWIP_CALLBACK_API:从宏名来看,应对应于回调函数驱动(不带操作系统),其实却是带操作系统下的事件驱动方式。<br /><br /><br />对LWIP结构没搞通,暂时这么理解吧,等搞清了再发!&nbsp;

armecos 发表于 2007-10-26 12:21

自己琢磨太慢,资料里有彩图,一看便知。

页: [1]
查看完整版本: 请教LWIP中err_t lwip_tcp_event()函数为什么没定义?