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还必须读取write_callbackX的特定内容,我们如何将recv_buff参数传递给callbackX? 我们必须承担全球变量的负担和丑陋吗?

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

问题作者说:

对不起,我想我现在得到了答案,对于我粗心阅读文档感到非常惭愧:

 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_; //... } 

是的,它在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文件 。