小弟最近在做个项目
服务端:
主线程用event_base_dispatch(g_eventBase);阻塞掉
子线程负责从数据库中读数据发送bufferevent_write()
初始化如下
[code=c]
struct sockaddr_in sSvrAddr;
memset(&sSvrAddr, 0, sizeof (sSvrAddr));
try
{
sSvrAddr.sin_family = AF_INET;
sSvrAddr.sin_addr.s_addr = inet_addr(g_strListenIP.c_str());
sSvrAddr.sin_port = htons(atoi(g_strListenPort.c_str()));
}
catch (...)
{
LOGERROR(g_Log, ERROR_CODE_UNDEFINED, "系统启动失败!请检查IP/PORT是否设置正确! IP:%s PORT:%s",
g_strListenIP.c_str(),g_strListenPort.c_str());
exit(0);
}
// 新建Base事件
g_eventBase = event_base_new();
evconnlistener *listener =
evconnlistener_new_bind(g_eventBase, listener_cb, g_eventBase,
LEV_OPT_REUSEABLE | LEV_OPT_CLOSE_ON_FREE|LEV_OPT_THREADSAFE,
5, (struct sockaddr*) &sSvrAddr,
sizeof (struct sockaddr_in));
evthread_use_pthreads();
event_base_dispatch(g_eventBase);
[/code]
listener_cb函数如下
[code=c]
struct sockaddr_in sCliAddr;
memcpy(&sCliAddr, sock, sizeof(sCliAddr));
//evutil_make_socket_nonblocking(iCliFd);
struct bufferevent* buf_ev;
buf_ev = bufferevent_socket_new(g_eventBase, iCliFd, BEV_OPT_CLOSE_ON_FREE|BEV_OPT_THREADSAFE);
bufferevent_setcb(buf_ev, readcb, NULL, errorcb, NULL);
bufferevent_enable(buf_ev, EV_READ | EV_WRITE);
[/code]
现在出现的问题是
过一段时间(不确定)就会出现所有的消息都无法触发任何callback函数,接收(进不了readcb函数)和发送消息(bufferevent_write返回成功加入,但是没有真正发出)也没有反应,但是调试跟踪代码时,发现还是在dispatch的循环中!请问是什么情况!
最新更新进展!我将bufferevent_write更新为write函数后,跑了几个小时了!目前没问题!应该是因为我只有一个线程涉及到了libevent,但是为什么啊!求教原因!