打印

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

[复制链接]
7250|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yanyunsong|  楼主 | 2007-10-26 09:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

最近闲来没事,在看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 09:57 | 只看该作者

这个叫做callback

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

使用特权

评论回复
板凳
yanyunsong|  楼主 | 2007-10-26 10:06 | 只看该作者

谢谢楼上

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

使用特权

评论回复
地板
armecos| | 2007-10-26 10:49 | 只看该作者

lwip有两种工作模式

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

使用特权

评论回复
5
yanyunsong|  楼主 | 2007-10-26 11:16 | 只看该作者

妄测

谢过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结构没搞通,暂时这么理解吧,等搞清了再发! 

使用特权

评论回复
6
armecos| | 2007-10-26 12:21 | 只看该作者

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

8

帖子

0

粉丝