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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1523203.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

python 正则表达式“.*”和“.*? ”的区别

“.*”和“.*? ”的区别 点号表示任意非换行符的字符&#xff0c;星号表示匹配它前面的字符0次或者任意多次。所以“.*”表示匹配一串任意长度的字符串任意次。这个时候必须在“.*”的前后加其他的符号来限定范围&#xff0c;否则得到的结果就是原来的整个字符串。 “.*? &…

“软件即仪器”——全新架构 Xtreme Vision显微测量软件平台

“软件即仪器”&#xff0c;工业测量软件较为复杂&#xff0c;涵盖了软件架构、信号处理、图像处理、数值计算、空间几何、三维建模、3D渲染、并行计算、人机交互等多种交叉软学科&#xff0c;是测量仪器系统极为重要的组成部分&#xff0c;中图仪器一直致力于自主化工业测量软…

使用AI写WebSocket知识是一种怎么样的体验?

一、WebSocket基础知识 1. WebSocket概念 1.1 为什么会出现WebSocket 一般的Http请求我们只有主动去请求接口&#xff0c;才能获取到服务器的数据。例如前后端分离的开发场景&#xff0c;自嘲为切图仔的前端大佬找你要一个配置信息的接口&#xff0c;我们后端开发三下两下开…

使用 Spring Cloud 有什么优势?

使用 Spring Cloud 有什么优势&#xff1f; 1. 简化复杂性2. 服务发现与注册3. 负载均衡4. 冗余与容错5. 性能与部署6. 生态系统与社区 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在微服务架构的浪潮中&#xff0c;Spring Cloud凭借其简…

传统CV算法——基于Opencv的多目标追踪算法

基于 OpenCV 的跟踪算法有多种&#xff0c;每种算法都有其特定的应用场景和优缺点。以下是一些常见的基于 OpenCV 的目标跟踪算法&#xff1a; 1. BOOSTING 跟踪器 描述&#xff1a;基于 AdaBoost 算法的跟踪器。它是一种早期的跟踪算法&#xff0c;使用的是基于弱分类器的强…

【数据结构篇】~链表算法题2

链表算法题2 1.返回倒数第k个节点思路解析 2.链表的回文结构​思路解析1&#xff08;空间复杂度不符合&#xff09;解析2 3.相交链表​思路解析 1.返回倒数第k个节点 OJ链接 思路 有点像高中学的相对位移 利用快慢指针&#xff0c;开始时都指向头节点&#xff0c;然后让快指…

VMware虚拟机安装的Ubuntu,桥接方式静态ip,内网可以访问,ping外网不可用

1.环境说明 系统&#xff1a;Ubuntu 24.04 环境&#xff1a;VMware下桥接静态IP设置 2.问题&#xff1a;ping www.baidu.com报错 [~] ping www.baidu.com ping: www.baidu.com: Temporary failure in name resolutio…

php邮箱服务器怎么搭建?如何构建服务器?

php邮箱服务器配置教程指南&#xff1f;php邮件服务器如何搭建&#xff1f; 搭建一个稳定高效的php邮箱服务器&#xff0c;不仅可以提升邮件传输的效率&#xff0c;还能增强数据的安全性。那么&#xff0c;如何着手搭建这样一个服务器呢&#xff1f;AokSend将详细探讨php邮箱服…

【Go - 每日一小问 ,const 变量存储在哪里,堆还是栈上?】

答&#xff1a;都不是 &#xff0c; 在bss(未初始化数据区) 和 data(初始化数据区)上。 在内存布局上遵循一定规律&#xff0c;Go 进程的内存空间布局由高地址到低地址大致可分为以下几段: 栈(stack): 用户态的栈&#xff0c;栈的大小是固定的&#xff0c;其大小可以使用ulimi…

云服务器中查看Nginx报错日志及解决思路

目录 前言 一、查看nginx日志信息 二、我的解决思路 前言 线上报错不可怕&#xff0c;能找到对应日志&#xff0c;那这个报错就解决一大半了。 默认情况下&#xff0c;nginx日志文件存储在 /var/log/nginx/ 目录中&#xff0c;cd /var/log/nginx/ 一、查看nginx日志信息 …

【hot100篇-python刷题记录】【跳跃游戏 II】

R7-贪心算法 目录 方法1&#xff1a; 方法2&#xff1a; 很贪心啊&#xff0c;局部最优解就是全局最优解&#xff0c;要求到达nums[n-1]的最小步数&#xff0c;我们每一步都走最远。 方法1&#xff1a; class Solution:def jump(self, nums: List[int]) -> int:nlen(n…

畅游5G高速网络:联发科集成Wi-Fi6E与蓝牙5.2的系统级单芯片MT7922

这周末,除非外面下钞票,否则谁也拦不住我玩《黑神话悟空》(附:两款可以玩转悟空的显卡推荐) IPBrain平台君 集成电路大数据平台 2024年09月03日 17:28 北京 联发科一直以创新技术追赶市场需求…… “不努力向前游就会被海浪拍回岸边…” 芯片设计公司产品层出不穷,想要站…

vue3+ts 实现模板表格文件下载~

1、效果图&#xff1a; 2、创建点击事件&#xff0c;并发起请求&#xff0c;获取模板表格文件下载url地址。 //组件 <a-button class"btn btn_width" click"download"> 下载模板 </a-button>// 文件模板下载 import { getTemplate } from /ap…

Linux【1】基础

目录 cd ​编辑 Linux的粘贴是Ctrlshiftv&#xff0c;复制、剪切&#xff1a; pwd打印当前路径 cat 文件目录 读取 ↑ 可以调取之间输过的命令 mv A B 把文件名A改成B #掐头%去尾 touch 文件名 mkdir创建目录​编辑 删除rm 只能删除文件 终端命令格式 帮助 man命…

RK3588 13.0去掉SystemUI快速设置选项

Android13.0的SystemUI下拉菜单有很多快速设置选项&#xff0c;有些选项对我们设备来说是多余的&#xff0c;用户要求去掉无用的选项&#xff0c;只保留Internet Bluetooth Screen record 去掉之前&#xff1a; 去掉之后&#xff1a; 为了去掉这些快速设置选项&#xff0c;试…

大零售时代:开源 AI 智能名片、2+1 链动与 O2O 商城小程序引领融合新趋势

摘要&#xff1a;本文深入探讨了当今零售业态的发展趋势&#xff0c;指出在数据匹配的时代&#xff0c;人依然在零售中发挥着重要作用。通过对大零售理念的阐述&#xff0c;分析了跨行业跨业态融合的必然性&#xff0c;强调了业态融合的指导思想以及实现方式。同时&#xff0c;…

List 的介绍

目录 1. 什么是List 2. 常见接口介绍 3. List的使用 1. 什么是List 在集合框架中&#xff0c; List 是一个接口&#xff0c;继承自 Collection 。 Collection 也是一个接口 &#xff0c;该接口中规范了后序容器中常用的一些方法&#xff0c;具体如下所示&#xff1a; Iterab…

【电源时序测量】

安捷伦示波器电源时序测量 电源时序测量可以表征电源的启动、关闭、负载瞬态响应和纹波等关键参数。 1. 时序测量工具 安捷伦示波器配备了各种时序测量工具&#xff0c;包括&#xff1a; 测量光标&#xff1a;用于手动测量时间间隔和幅度。 自动测量&#xff1a;自动测量特定…

Golang | Leetcode Golang题解之第394题字符串解码

题目&#xff1a; 题解&#xff1a; var (src stringptr int )func decodeString(s string) string {src sptr 0return getString() }func getString() string {if ptr len(src) || src[ptr] ] {return ""}cur : src[ptr]repTime : 1ret : ""if cur &…

python学习之路 - PySpark快速入门

目录 一、PySpark实战1、前言介绍2、基础准备a、pySpark库的安装b、构建pySpark执行环境入口对象c、pySpark编程模型 3、数据输入a、python数据容器转RDD对象b、读取文件内容转RDD对象 4、数据计算a、map算子b、flatMap算子c、reduceByKey算子d、综合案例e、filter算子f、disti…