我陷入了在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:
// .......
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果write_callbackX还必须读取recv_buff中的具体内容,我们如何将recv_buff参数传递给callbackX?我们必须承担全球变量的负担和丑陋吗?
作者自己回答,但是在评论中.由于这显示为未答复,我在"回答"部分发布他的答案并关闭循环.不确定是否有更好的方法...随时解决这个问题.
问题作者说:
对不起,我想我现在得到了答案,对于我粗心阅读文档感到非常惭愧:
Run Code Online (Sandbox Code Playgroud)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:
Run Code Online (Sandbox Code Playgroud)static void my_cb (struct ev_loop *loop, ev_io *w_, int revents) { struct my_io *w = (struct my_io *)w_; //... }