首页 > 代码库 > 一个包的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流程