首页 > 代码库 > NGP处理包
NGP处理包
NGP处理部分(主要就是这个RunOnce函数,客户单肯定是开个线程取调用这个RunOnce的)void NGP::RunOnce(){ m_spTimerFac->driveTimer();//客户端心跳包驱动 //先检查一下其他命令 if(m_queFunctions.size()) { for (;;) { std::function<void()> fun; { std::lock_guard<std::mutex> lock(m_PktMutex); fun = m_queFunctions.front(); } fun(); { std::lock_guard<std::mutex> lock(m_PktMutex); m_queFunctions.pop(); } if(0 == m_queFunctions.size()) break; } } //检查数据包,一次最少处理10个命令 for (int i = 0; i < 20; i++) { if (m_quePktQueue.size() == 0) break; date_pkt pkt; { std::lock_guard<std::mutex> lock(m_PktMutex); pkt = m_quePktQueue.front(); m_quePktQueue.pop(); } ProcessDate(pkt.date, pkt.len); delete[] pkt.date; } //_TcpLink->run_one();}连接事件就这几个OnConnectFailed--->直接连接失败了,在bufferevent_socket_connect,这个就相当于socket里面的connectOnConnected--->连接成功了OnDisconnected--->这个是服务端突然蹦了,这样客户端也能收到通知这些事件相应的绑定函数放到m_queFunctions队列中,runonce可以直接调用传递进来的绑定函数bool NGP::OnRec(void* pBuffer, int nSize){ date_pkt pkt; pkt.len = nSize; pkt.date = new char[nSize];//注意在runonce中释放内存 memcpy(pkt.date, pBuffer, nSize); { std::lock_guard<std::mutex> lock(m_PktMutex); m_quePktQueue.push(pkt); } return true;}对于接收的包放到m_quePktQueue,在初始化的时候会创建一个map,key是协议,value是绑定好的函数对象,在runonce中使用protocol来解析发送过来的包,这个包是符合协议的,那么第一个字节就是协议,后面是长度和内容,然后根据协议查找map,调用绑定好的函数。根据协议类型调用绑定函数这种方法在服务器很多。对于协议解析和中间的线程加锁理解不是太好
NGP处理包
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。