• 一个包的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;
    }
    把这两个问题搞懂,接下来就是最难的共享内存部分了,弄懂这个部分,废大劲了
  • 相关阅读:
    所谓的小项目
    PHP开发者常犯的10个MySQL错误
    这是掌握cookie最后的一个障碍
    Lua学习笔记(2)——table
    Corona Enterprise 引入第三方 jar 包
    Lua学习笔记(1)
    SQL分页查询笔记
    三两句记录设计模式(1)——简单工厂模式
    Window + Net + Corona + IOS PUSH
    IoC学习
  • 原文地址:https://www.cnblogs.com/zzyoucan/p/4082649.html
Copyright © 2020-2023  润新知