zoukankan      html  css  js  c++  java
  • 一个包的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;
    }
    把这两个问题搞懂,接下来就是最难的共享内存部分了,弄懂这个部分,废大劲了
  • 相关阅读:
    2019年下半年学习总结
    要看的积累
    【长期积累】Java
    【长期积累】数据库
    一些知识总结
    一些小总结
    优秀前端框架Semantic UI
    windows nodejs express的安装
    形象的讲解angular中的$q与promise(转)
    centos6.5 install mongodb
  • 原文地址:https://www.cnblogs.com/zzyoucan/p/4082649.html
Copyright © 2011-2022 走看看