我陷入了在自由中传递论据的情况。
通常,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?我们必须承担全局变量的负担和丑陋吗?
答案 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。