TeamTalk路由服务器

路由相关信令和协议设计

复制代码
enum BuddyListCmdID {
  // ...... 暂时省略无关信令
  CID_BUDDY_LIST_USERS_STATUS_REQUEST = 522,
  CID_BUDDY_LIST_USERS_STATUS_RESPONSE = 523,
  // ...... 暂时省略无关信令
};

message IMUsersStatReq{
	//cmd id:		0x020a
	required uint32 user_id = 1;
	repeated uint32 user_id_list = 2;
	optional bytes attach_data = 20;
}

message IMUsersStatRsp{
	//cmd id:		0x020b
	required uint32 user_id = 1;
	repeated IM.BaseDefine.UserStat user_stat_list = 2;
	optional bytes attach_data = 20;
}

enum UserStatType{
	USER_STATUS_ONLINE 	= 1;
	USER_STATUS_OFFLINE	= 2;
	USER_STATUS_LEAVE	= 3;
}

流程图

具体代码逻辑

  1. 在 g_user_map 中根据 user_id 查找对应的状态

  2. 如果不在列表设置为下线状态;如果在列表设置为对应的状态;

  3. 组包回复

    void CRouteConn::_HandleUsersStatusRequest(CImPdu* pPdu)
    {
    IM::Buddy::IMUsersStatReq msg;
    CHECK_PB_PARSE_MSG(msg.ParseFromArray(pPdu->GetBodyData(), pPdu->GetBodyLength()));

    复制代码
     uint32_t request_id = msg.user_id();
     uint32_t query_count = msg.user_id_list_size();
     log("HandleUserStatusReq, req_id=%u, query_count=%u ", request_id, query_count);
    
     IM::Buddy::IMUsersStatRsp msg2;
     msg2.set_user_id(request_id);
     msg2.set_attach_data(msg.attach_data());
     list<user_stat_t> result_list;
     user_stat_t status;
     for(uint32_t i = 0; i < query_count; i++)
     {
         IM::BaseDefine::UserStat* user_stat = msg2.add_user_stat_list();
         uint32_t user_id = msg.user_id_list(i);
         user_stat->set_user_id(user_id);
         CUserInfo* pUser = GetUserInfo(user_id);
         if (pUser) {
             user_stat->set_status((::IM::BaseDefine::UserStatType) pUser->GetStatus()) ;
         }
     	else
     	{
             user_stat->set_status(USER_STATUS_OFFLINE) ;
     	}
     }
    
     // send back query user status
     CImPdu pdu;
     pdu.SetPBMsg(&msg2);
     pdu.SetServiceId(SID_BUDDY_LIST);
     pdu.SetCommandId(CID_BUDDY_LIST_USERS_STATUS_RESPONSE);
     pdu.SetSeqNum(pPdu->GetSeqNum());
     SendPdu(&pdu);

    }

    CUserInfo* GetUserInfo(uint32_t user_id)
    {
    CUserInfo* pUser = NULL;
    UserInfoMap_t::iterator it = g_user_map.find(user_id);
    if (it != g_user_map.end()) {
    pUser = it->second;
    }

    复制代码
     return pUser;

    }

相关推荐
傲世仙尊4 分钟前
继承-类设计层次复用切片转换与菱形继承的死结
c++
架构师伯子明6 分钟前
FFmpeg C++学习(一):编译和demo
开发语言·c++·学习
叼烟扛炮19 分钟前
[LangChain] 学习笔记(02):LCEL 链式调用与动态模型配置实战
服务器·开发语言·网络·笔记·学习·langchain
纪念 22930 分钟前
C++算法(六)
开发语言·c++·算法
`Levie41 分钟前
MySQL-数据库服务日志管理与数据闪回
数据库·mysql
香蕉大香蕉(06敬畏市场)1 小时前
MySQL 单点详解(01)
java·数据库·mysql·面试·博客·实习
小小张说故事1 小时前
Python 的 str 为什么设计成不可变?拆开字符串驻留、字符串池,以及 += 拼接到底慢在哪
后端·python
ShineWinsu1 小时前
对于Qt:QCheckBox常见属性的详细解析
c++·qt·面试·笔试·gui·qcheckbox·多选框
AI架构师之家1 小时前
我把 Hermes 这匹"马"养了两周,它干了一件让我有点发毛的事
后端
未来之窗软件服务1 小时前
Linux 运维日志删除的多种方式—东方仙盟
linux·运维·服务器·仙盟创梦ide·东方仙盟