一个包的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;
}
把这两个问题搞懂,接下来就是最难的共享内存部分了,弄懂这个部分,废大劲了
时间: 2024-08-05 23:31:41

一个包的TcpServer流程的相关文章

一个包的libevent流程

//一个发包的流程 第一个包就是客户端的心跳包,现在加了版本的包 再来看看这个发包打包过程,过程坚持,但理解费劲 void NGP::OnliveTimer()//客户端心跳,5s发一次 { SendCmd(c2s_on_live, NULL, 0); } bool NGP::SendCmd(int nCmd, void* pData, int nLen) { //std::wstring msg = L"发送命令:"; //msg += boost::lexical_cast<

一个包的net到gs流程

再来看看一个包走共享内存的流程 先来看看net进程这块如何处理的 {//用shareData这种类型封装刚才从无锁队列中取到的包 shareData sd; sd.channel_id = pkt.channel_id; sd.data = pkt.data; sd.is_data = pkt.is_data; sd.size = pkt.size; auto hr = m_spShareMemInter->pushA(sd);//将这个包放入共享内存中 } //具体看下是如何放入共享内存的 b

一个包从共享内存到达服务器

一个包到从共享内存到GS流程 上次说到一个包从共享内存池取到一个包之后放入共享队列中 hr = m_spShareMemInter->pushA(sd); 看看GS这边是如何取包的 主线程创建了一个子线程 void GameServer::ProcessThread() { try { ProcessThreadTry(); } catch (...) { DWORD dwErrno = GetLastError(); MessageBox(NULL, L"GameServer::proc

想:类在一个包提前声明,然后在另一个包描述具体的类内容,但是有问题

想法源于:类可以提前声明,具体类内容可以后面写明: TFrmChangePWTransparent = class; //这里声明其他的类,或一些表里 TFrmChangePWTransparent = class(TForm) end; 构思:一个包写好好多类名,然后在另一包写好具体类的属性方法,但是后来发现这是不可以的 type TProtocolUniITPFrameDataBuilder = class; TProtocolUniITPFrameDataStreamBuilder = c

一个包从服务器到达客户端

服务器发包到客户端 以登录包为例 SendCmd(s2c_login, &ret, sizeof(LoginEnum)); end_stat BaseChannel::SendCmd(int nCmd, void* pData, int nLen) { Protocol Ptl; Ptl.cmd_type = nCmd; Ptl.content = pData; Ptl.size = nLen; void* tmpBuffer = g_SendCmdBuffer; int nBufferLen

Android Studio突然不能导入某一个包

在AS给带来方便的同时,也因为AS反应太迅速,就会出现无法自动导入某一个包的问题.在开发的时候不知道按错哪个键,使得ListView无法自动导入. 后来才发现问题的所在.如图:(Settings--->Editor---->General---->Auto Import) 选中android.widget.ListView,点击红色减号即可(“-”),具体不知道AS添加这一功能的作用.

判断一个Activity 判断一个包 是否存在于系统中 的方法

判断一个包是否存在于系统中(来自网络),经过测试,好用: public boolean checkBrowser(String packageName) { if (packageName == null || "".equals(packageName)) return false; try { ApplicationInfo info = getPackageManager().getApplicationInfo( packageName, PackageManager.GET_

shell脚本,一个shell的启动流程。

#一个shell的启动流程 #shell有一些变量,叫做环境变量,这些变量是可以继承的, #比如父shell有$UID,子shell也可以有,而且继承父shell的. #正常我们声明一个变量,a=1,在子shell里,a是空,自己声明的变量不能被继续. 如果我们自己声明变量,想让子shell也可以用 [[email protected] wyb]# cat a.sh #!/bin/bash echo $a #如果我们自己声明变量,想让子shell也可以用,#export 是内置变量,通过它声明的

python高级编程 编写一个包1

#目的是:编写,发行python包可重复过程"""1:是缩短开始真正工作之前所需要的设置时间,也就是提供模板2:提供编写包的标准化方法3:简化测试驱动开发方法的使用4:为发行过程提供帮助5:用于所有包公用模式,描述所有python包之间相同之处和distutils和setuptools如何扮演核心角色6:产生式编程:(在维基百科里面搜索)如何通过基于模板方法对此提供帮助7:包模板创建,设置各种工作所需要的一切8:构建一个开发周期"""#用于所有包