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