23

我陷入了在 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?我们必须在这里承担全局变量的包袱和丑陋吗?

4

2 回答 2

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_;
   //...
}
于 2013-07-11T16:14:03.400 回答
2

是的,它在 libev 文档中进行了解释,还有另一种方法。每个观察者都有一个 void *data 成员,您可以读取或修改它,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 文档

于 2015-01-17T10:51:35.393 回答