首页 > 代码库 > 一个包的TcpServer流程
一个包的TcpServer流程
上次说到对于那种有内容的包bool TCPServer::on_receive_data(int channel_id, void* data, int len){ packet pkt; { pkt.data = m_memPool.popPkt(len);//从内存池分配len大小的内存,返回地址,此处为什么使用内存池不太清楚 } memcpy(pkt.data, data, len); pkt.size = len; pkt.channel_id = channel_id; pkt.is_data = true; from_net_push_pkt(pkt);//放到无锁队列中 return true;}net启动的时候会创建一个线程专门从无锁队列中读包,然后放入共享内存中bool TCPServer::recv(packet& pkt){ //((I_LibEvtServer*)m_spTCPServer[0].get())->run_once();#ifdef BOOST_LOCKFREE if(m_all_packet.empty()) return false; void* p = pkt.data; bool hr = m_all_packet.pop(pkt); if(!hr) return false; if(pkt.is_data) { memcpy(p, pkt.data, pkt.size); //服务器有好多都是依照这个原理做的 m_memPool.pushPkt(pkt.data, pkt.size);//归还内存池(对于这种模式,我不太懂为什么这样,一个线程把包放入无锁队列中,另一个线程从无锁队列中读) } pkt.data = p; --consumer_count; return true;}把这两个问题搞懂,接下来就是最难的共享内存部分了,弄懂这个部分,废大劲了
一个包的TcpServer流程
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。