Libev,如何将参数传递给相关的回调

时间:2012-03-30 04:26:12

标签: c callback 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?我们必须承担全局变量的负担和丑陋吗?

2 个答案:

答案 0 :(得分: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_;
   //...
}

答案 1 :(得分:2)

是的,它在libev文档中有解释,还有另一种方法。每个观察者都有一个你可以阅读或修改的void *数据成员,libev会完全忽略它,所以你可以传递这样的参数:

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