再看GS接包过程

再看GS接包过程
bool GameServer::ProcessLoop(packet& rPkt)
{
    if(false == m_spDataLayer->Recv(rPkt))
        return true;//没数据了

    if(rPkt.is_data)
    {
        if(!rPkt.data)
            return false;

        GameChannel* pGC = m_vecChannel[rPkt.channel_id];
        if(pGC)
            pGC->OnReceiveData(rPkt.data, rPkt.size);//回调GC中相关函数

        m_LiveMgr.OnLive(rPkt.channel_id);
    }
    else
    {
        //网络事件
        link_stat stat = (link_stat)rPkt.size;
        if (stat == link_stat::link_connected)
        {
            GameChannel* pNewGC        = new GameChannel();
            pNewGC->m_nChannelId    = rPkt.channel_id;
            pNewGC->m_pDataLayer    = m_spDataLayer.get();//m_pDataLayer,GC直接发包到客户端
            pNewGC->m_pShare        = this;
            pNewGC->m_pAsynDBC        = this->m_spAsynDBC.get();//GC直接跟数据库打交道

            m_vecChannel[rPkt.channel_id] = pNewGC;
            m_LiveMgr.Add(rPkt.channel_id);
        }
        else if (stat == link_stat::link_disconnected || stat == link_stat::link_connect_failed )
        {
            GameChannel* pDisconnectGC = m_vecChannel[rPkt.channel_id];
            if (pDisconnectGC)
            {
                //如果进入了地图,保存人物信息时会调用push_freeQueue + 滞空m_Channels[channel_id],
                pDisconnectGC->OnDisconnect();//做人物下线收尾工作,该通知map,数据库访问操作,等,根据玩家的状态来

                //如果未进地图就下线,直接断开;不用保存角色详细数据,可直接放入释放队列中
                if (!pDisconnectGC->m_pMap)//如果进入地图需要从map返回数据然后保存数据库
                {
                    AutoFreeGC(pDisconnectGC);//如果没有数据库访问直接释放,或者放到队列等无数据库访问在释放
                }
            }
            m_LiveMgr.Remove(rPkt.channel_id);
        }
    }
    return false;
}
时间: 2024-10-13 12:05:53

再看GS接包过程的相关文章

再看GS线程

再看GS线程 void GameServer::ProcessThreadTry() { int nCount = 0; packet rcvPkt; rcvPkt.data = new char[1024 * 100]; //该事件工厂主要创建了两个定时器1.livemgr的检测(即是否是有效的连接)2.道具帮会差异更新数据的获取即定时从道具帮会容器中获取差异需要保存到数据库的这个数据 //3.释放队列的处理,现在玩家下线不是直接把channel删除掉而是放到释放队列中等没有数据库访问时在删除

一次刨根问底的socket收包过程(Linux)

Linux会对一个网络包(packet)的收和发做大量的处理.packet在被发送之前会被存在队列中,而在被接受之后也会存在队列中,共有三个队列:reception(接收),transmission(发送)和Backlog.它们都受到spinlock的保护,是为了保证在并发访问时的一致性.言归正传,接下来看看当一个packet到达NIC(网卡)时,linux都会做些什么工作. 先来看一个图(来自论文 Analysis of Linux UDP Sockets Concurrent Perform

代码学习-Linux内核网卡收包过程(NAPI)

本文通过学习RealTek8169/8168/8101网卡的驱动代码(drivers/net/r8169.c),梳理一下Linux下网卡的收包过程. 在下水平相当有限,有不当之处,还请大家斧正^_^ 驱动的初始化 如下的rtl8169_init_module函数是此驱动的初始化代码,此函数只干了一件事,就是向内核注册一个pci驱动rtl8169_pci_driver. static int __init rtl8169_init_module(void) { returnpci_register

再看Ajax

再回顾Ajax相关的内容,再次梳理学习还是很有必要的,尤其是实际的开发中,ajax更是必不可少,仔细学习以便避免不必要的错误. 文章导读: --1.使用XMLHttpRequest---------- 1.1 必备知识点 1.2 send()方法 1.3  再看CORS --2.HTTP请求和响应---------------- 2.1 Request Header中的参数 2.2 Response Header中的参数 2.3 GET请求和POST请求的区别 --3.jQuery中的Ajax-

再看数据库——(1)存储过程

当我们执行一个比较简单的操作时,一般都是用SQL语句.但是当逻辑越来越复杂时,仅仅使用顺序执行的SQL语句序列表现出很大的局限性.这时,就可以考虑用另一种方法了,那就是存储过程. 现在数据库系统往往采用客户机/服务器计算模式,很多工作可以在客户端完成,也可以在服务器端完成.客户机/服务器系统与传统的数据库系统的一个很重要的区别是,在传统的数据库系统中只存放数据,所有的应用程序都在用户端,都与用户实际运行的应用程序捆绑在一起:而客户机/服务器系统中,在数据库中还存放程序,由于这种程序以数据库对象的

WireShark抓包过程

wireshark是非常流行的网络封包分析软件,功能十分强大.可以截取各种网络封包,显示网络封包的详细信息.使用wireshark的人必须了解网络协议,否则就看不懂wireshark了. 为了安全考虑,wireshark只能查看封包,而不能修改封包的内容,或者发送封包. wireshark能获取HTTP,也能获取HTTPS,但是不能解密HTTPS,所以wireshark看不懂HTTPS中的内容,总结,如果是处理HTTP,HTTPS 还是用Fiddler, 其他协议比如TCP,UDP 就用wire

再看数据库——(7)游标

背景: 其实<再看数据库>系列博客本没有计划写这么多,但最近确实接触数据库比较多,又接触了这些东西,在之前很少用到,因此就整理下,和大家分享. 简介: 游标,是一个数据缓冲区,用来存放SQL语句的执行结果.与一般的执行过程不同的是,游标是从结果集中每次提取一条记录. 与关系数据库的区别: 关系数据库--面向集合,一般执行结果都是一个集合,如果要选择其中一条或几条记录,就要用where子句. 游标     --面向单条记录.游标可以对查询语句返回的结果集中的每一行进行相同或不同的操作. 因此说,

再看数据库——(3)触发器

概念: 触发器,顾名思义,它是由事件来触发的.比如当我们对表进行操作时就会激活它执行. 说到触发器,还要提一个关键点,那就是"保持数据完整性".什么意思呢?比如业务需求是,当我们注销一个卡号时,把该卡的充值.上机等信息也一并删除.这时如果是一个一个操作执行,就会是:注销卡--删除卡的充值信息--删除卡的上机信息(两个删除操作不分先后).这样做的弊端是,我们很容易把其中的一个步骤遗漏了,业务也不完整.用了触发器以后,当我们注销卡时激活触发器执行删除操作. 用触发器的好处就是很大程度上有利

从程序员到项目经理(28):该死的结果导向(只看结果,不问过程到底行不行?)【转载】

在当今流行的管理体系中,结果导向由于迎合了公司高层的味口而大行其道.项目成功,你就是英雄:出了问题你就是狗熊,而不管是什么原因.正因为如此,在传统的目标管理中,公司与员工之间充满了博弈,导致双方出现了难以调和的矛盾.这一节我要为项目经理鸣不平,同时也替公司着想,将员工从不近人情的"成王败寇"的模式中解脱出来,实现公司与员工的双赢. 1.两种评价项目的导向之争 公司和项目经理博弈,主要体现在项目目标的制定.以及对项目结果的评价方面.毫无疑问,公司是结果导向的,结果好才是真的好,其它全部都