These days, I use libevent IOCP for my server programming, but I was trapped
in a situation where some network package data sent by client first time
will be lost. The following codes suffers from that bug.
m_pBufferEvent = bufferevent_socket_new( pBase, fSocket,
BUFFER_EVENT_OPTION );
bufferevent_enable( m_pBufferEvent, EV_WRITE | EV_READ );
bufferevent_setcb( m_pBufferEvent, OnRead, NULL, OnEvent, &m_qwSessionID );
After some days diving into libevent source code and debugging, I find the
reason. Bufferevent_enable() will invoke user callback if there is a data in
input buffer, but now user callback hasn't been set. So you have to set user
callback before you enable buffer read and write. Like this:
m_pBufferEvent = bufferevent_socket_new( pBase, fSocket, BUFFER_EVENT_OPTION
);
bufferevent_setcb( m_pBufferEvent, OnRead, NULL, OnEvent, &m_qwSessionID );
bufferevent_enable( m_pBufferEvent, EV_WRITE | EV_READ );
I think bufferevent_setcb() should call user callback when there is some
data. Or you must add relevant comments to this function to warn developers.