当前位置: 首页 > news >正文

TeamTalk路由服务器

路由相关信令和协议设计

enum BuddyListCmdID {// ...... 暂时省略无关信令CID_BUDDY_LIST_USERS_STATUS_REQUEST = 522,CID_BUDDY_LIST_USERS_STATUS_RESPONSE = 523,// ...... 暂时省略无关信令
};message IMUsersStatReq{//cmd id:		0x020arequired uint32 user_id = 1;repeated uint32 user_id_list = 2;optional bytes attach_data = 20;
}message IMUsersStatRsp{//cmd id:		0x020brequired 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 statusCImPdu 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;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 深度学习100问44:如何避免模型出现过拟合现象
  • 解决Selenium已安装,在pycharm导入时报错
  • K8s系列之:K8s OPERATOR是什么
  • Python matplotlib绘图 plt.barh 水平条形图调整顺序逆序排列
  • Docker 的安全优化
  • Git版本控制策略:Rebase还是Merge?详解优缺点与适用场景
  • 【 OpenHarmony 系统应用源码魔改 】-- Launcher 之「桌面布局定制」
  • 012 MPLS技术在企业网络中的应用
  • 深度学习100问42:什么是GNMT
  • 每天五分钟计算机视觉:人脸识别网络FaceNet
  • adb大全指令(持续更新)
  • python 安装
  • LabVIEW水泵机组监控系统
  • 智能体与在线实用工具:协同并进,提升生活效率
  • 获取指定类的所有成员属性上的指定注解的属性值
  • 【5+】跨webview多页面 触发事件(二)
  •  D - 粉碎叛乱F - 其他起义
  • DOM的那些事
  • FastReport在线报表设计器工作原理
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • JavaScript服务器推送技术之 WebSocket
  • Java的Interrupt与线程中断
  • JS变量作用域
  • PHP 7 修改了什么呢 -- 2
  • Python爬虫--- 1.3 BS4库的解析器
  • SOFAMosn配置模型
  • tab.js分享及浏览器兼容性问题汇总
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 我的zsh配置, 2019最新方案
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 交换综合实验一
  • # Redis 入门到精通(一)数据类型(4)
  • (1)(1.11) SiK Radio v2(一)
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (3)(3.5) 遥测无线电区域条例
  • (4)logging(日志模块)
  • (C11) 泛型表达式
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (ZT)薛涌:谈贫说富
  • (二刷)代码随想录第15天|层序遍历 226.翻转二叉树 101.对称二叉树2
  • (附源码)ssm高校实验室 毕业设计 800008
  • (三)mysql_MYSQL(三)
  • (图)IntelliTrace Tools 跟踪云端程序
  • (转)C#调用WebService 基础
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)setTimeout 和 setInterval 的区别
  • (转)可以带来幸福的一本书
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .Net core 6.0 升8.0
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .Net 执行Linux下多行shell命令方法
  • /usr/bin/env: node: No such file or directory
  • [2021 蓝帽杯] One Pointer PHP