留下一个问题吧:
使用libevent 做网络库,创建一个服务端,
1、初始化struct event_base 成功;
2、创建监听器成功,evconnlistener_new_bind();
3、创建信号事件成功,evsignal_new() 成功;
4、添加信号事件成功,event_add() 成功;
5、开始事件循环,event_base_dispatch(struBase)。
当有客户端连接上来时,触发了连接回调函数(accept_cb()) ,在这个函数里面,使用bufferevent_socket_new() 函数构造一个struct bufferevent *bev; 并且检查返回值为成功。接下来,使用bufferevent_setcb() 进行读/写/事件 发生时的回调函数。bufferevent_setcb(bev, read_cb, write_cb, event_cb, NULL); 这个函数并没有返回值,所以应该不会有失败的情况。然后调用bufferevent_enable(bev, EV_READ | EV_WRITE); 使其读/写 事件的回调函数生效,
但是问题就出在这里,这个函数调用失败了,返回值为-1.EV_WRITE 这个写的回调函数倒是没有问题,只是EV_READ 的回调函数生效失败。如果忽略了返回值的检查,那么在客户端连接上来之后会出来一个警告语句: [warn] event_add: event has no event_base set. 并且读取回调函数不会被触发。
OK,问题的现象就是这样,先记录在这里。暂时还没找到原因。待找到原因再补上解决方法。
好糗啊!~
居然是在调用evconnlistener_new_bind(), 函数时将第三个参数设置为了NULL,而这个参数是第二个参数的回调函数的参数。我却用这个NULL,当做struct event_base * 转换过来了再用。主要是嫌麻烦,没有用GDB 调试。嘻嘻。SORRY!~