2012-03-30 182 views
24

我被困在libev中传递参数的情况下。Libev,如何将参数传递给相关的回调函数

通常,libev接收包的功能一样* receive_callback *,这是确定的,但在实践中,我们需要派遣一个相对* write_callback *根据接收到的包来处理特定的工作。例如:

S_RECV_MSG* pstRecvMsg = (S_RECV_MSG*) recv_buff; 
switch(pstRecvMsg->wMsgType) { 
    case 1: 
     ev_io_init(w, write_callback1, w->fd, EV_WRITE); 
     break; 
    case 2: 
     ev_io_init(w, write_callback2, w->fd, EV_WRITE); 
     break; 
    case 3: 
     // ....... 
} 

我的问题是,如果write_callbackX还具有读的recv_buff的具体内容,我们怎么能传递recv_buff参数传递给callbackX?我们是否必须在这里承担全局变量的负担和丑陋?

+18

这是正确的答案,如果你想把它写成一个真实的答案并接受它,让其他人更容易找到信息。 – dnaq 2012-07-03 19:11:32

+3

至少你回去继续研究,而不是等待回答:)很高兴你解决了它。 – 2013-01-25 16:09:39

+15

如果我在某些数据中使用堆内存,我建议将您的解决方案编写为答案(然后接受它),而不是在问题 – Shahbaz 2013-02-05 18:10:14

回答

5

作者自己回答,但在评论中。由于这显示为未答复,我在 发布他的答案在“答案”部分,并关闭循环。不知道是否有更好的方法...随时解决这个问题。

问作者说:

对不起,我想我得到了答案,现在,觉得我的 粗心大意阅读文档深感惭愧:

struct my_io{ 
    ev_io io; 
    int otherfd; 
    void *somedata; 
    struct whatever *mostinteresting; 
}; 
// ... 
struct my_io w; 
ev_io_init (&w.io, my_cb, fd, EV_READ); 

然后我们使用my_io像这样的:

static void my_cb (struct ev_loop *loop, ev_io *w_, int revents) 
{ 
    struct my_io *w = (struct my_io *)w_; 
    //... 
} 
+0

中进行编辑,那么释放它的正确方法是什么? – 2013-12-18 04:56:12

+0

我不明白。在my_cb回调中,如何将ev_io * w_转换为(struct my_io *)? – lppier 2015-07-27 08:13:45

+0

@lppier'ev_io'是'my_io'中的第一个成员,因此它的地址可以通过该演员获得。 – 2016-11-22 20:34:31

1

是的,它是在解放文件中解释,还有另一种方法。每个观察有可以读取或修改,并libev将完全忽略它一个void *数据成员,那么你可以通过这样的论点:

w->data = (void *)recv_buff; 
... 
static void my_cb (struct ev_loop *loop, ev_io *w_, int revents) 
{ 
    S_RECV_MSG *recv_buff = (S_RECV_MSG*)w_->data; 
    ... 
} 

看到libev document

+0

使用 - >数据是一种比'子类化'技术更好的方法 – matiu 2016-04-09 05:02:20

相关问题