网络流程图
解释一下网络的调度过程 客户机连接: 服务器监听线程收到连接,轮询libevent线程,扔给轮询线程的连接队列中,向socketpair发送c一个字节,lib线程收到通知根据fd创建与客户机通信的bufferevent,然后将这样一个连接事件放入线程的状态改变队列(w2m_state_change_que)中 后面就是直接这个线程与客户机通信 通信发送数据 1.几个libevent线程都将讲数据放到一个无锁队列中这个没什么(这个是从客户端接收数据) 2.从服务器发送数据到客户端,在主线程里面send_data,然后放到线程信息的m2w_ask_que的中去,然后这个Lib线程自己去发送 断开连接 也是将状态变化放入w2m_state_change_que中 现在说说主线程的driver()操作 这个我认为是因为玩家的channel在一个线程去决定其是否有效是比较安全的 bool LibEvtServer::driver() { bool has_post = false; ConnectState state_change; for (auto work_thread : m_libevent_threads) { while (work_thread->w2m_state_change_que.PopData(&state_change)) { m_vec_channel_plt[state_change.m_channel_id] = state_change.m_is_connect ? work_thread : NULL; has_post = true; } } return has_post; } 经过这样改动,libevent线程就自己去管自己所属客户端的发送和接收数据,而主线程管连接是否有效,因为之前有这样一个问题,就是将玩家踢下线,不能理解将这个socket关闭,因为 关闭之后子线程有可能还去操作这个socket造成错误,说实话这个没看懂,恕我愚钝。。。