• 网络流程图


    解释一下网络的调度过程
    客户机连接:
    服务器监听线程收到连接,轮询libevent线程,扔给轮询线程的连接队列中,向socketpair发送c一个字节,lib线程收到通知根据fd创建与客户机通信的bufferevent,然后将这样一个连接事件放入线程的状态改变队列(w2m_state_change_que)中
    后面就是直接这个线程与客户机通信
    
    通信发送数据
    1.几个libevent线程都将讲数据放到一个无锁队列中这个没什么(这个是从客户端接收数据)
    2.从服务器发送数据到客户端,在主线程里面send_data,然后放到线程信息的m2w_ask_que的中去,然后这个Lib线程自己去发送
    
    断开连接
    也是将状态变化放入w2m_state_change_que中
    
    
    现在说说主线程的driver()操作
    这个我认为是因为玩家的channel在一个线程去决定其是否有效是比较安全的
    bool LibEvtServer::driver()
    {
        bool has_post = false;
        ConnectState state_change;
        for (auto work_thread : m_libevent_threads)
        {
            while (work_thread->w2m_state_change_que.PopData(&state_change))
            {
                m_vec_channel_plt[state_change.m_channel_id] = 
                    state_change.m_is_connect ? work_thread : NULL;
                has_post = true;
            }
        }
        return has_post;
    }
    
    经过这样改动,libevent线程就自己去管自己所属客户端的发送和接收数据,而主线程管连接是否有效,因为之前有这样一个问题,就是将玩家踢下线,不能理解将这个socket关闭,因为
    关闭之后子线程有可能还去操作这个socket造成错误,说实话这个没看懂,恕我愚钝。。。
  • 相关阅读:
    2020-12-13 助教一周总结(第十五周)
    2020-12-06 助教一周总结(第十四周)
    2020-11-29 助教一周总结(第十三周)
    2020-11-22 助教一周总结(第十二周)
    2020-11-15 助教一周总结(第十一周)
    暗时间读后感
    2020-11-08 助教一周总结(第十周)
    软件工程助教总结
    2020-12-27助教一周总结(第十七周)
    2020-12-20助教一周总结(第十六周)
  • 原文地址:https://www.cnblogs.com/zzyoucan/p/4343395.html
Copyright © 2020-2023  润新知