- 博客(105)
- 资源 (8)
- 收藏
- 关注
原创 TeamTalk整体梳理
答:A发送消息给客户端B,msg_server收到后,直接将数据包转发db_proxy_server,db_proxy_server有一个map来映射信令所对应的处理函数。msg_server连上login_server后会立刻给login_server发一个数据包,该数据包里面含有该msg_server上的用户数量、最大可容纳的用户数量、自己的ip地址和端口号。多个msg_server和db_proxy_server建立连接时,会将每个proxyconn连接和m_uuid一一对应映射起来。
2024-11-17 17:44:22 951
原创 reactor模型
思路:先整体概述reactor模型;然后说一个例子。Reactor可以理解为「来了事件操作系统通知应用进程,让应用进程来处理」。中心思想是将所有要处理的I/O事件注册到I/O复用函数上,同时主线程/进程阻塞在I/O复用函数上,一旦有I/O事件到来或是准备就绪(文件描述符或socket可读、写),I/O复用函数返回并将事先注册的相应I/O事件分发到对应的处理器中。Reactor是非阻塞同步网络模式,感知的是就绪可读写事件。
2024-10-18 22:42:58 581
原创 TeamTalk梳理概括
同时把消息进行持久化,将聊天消息发给这个 DBProxy(数据库代理服务),存储消息成功后,DBProxyServer组包应答MsgServer,MsgServer收到回复后组包应答Client A。如果 A 和 B 两个用户不在同一个 MsgServer 上,那么会通过这个 RouteServer 去中转Pdu包数据(广播给所有的MsgServer,MsgServer再广播给Client B),B收到消息后应答MsgServer,至此,流程结束。7. 单聊和群聊消息未读计数机制为什么不同?
2024-09-16 21:08:44 1096
原创 TeamTalk数据库代理服务器
db_proxy_server 处理逻辑与其他server不同的是 epoll(主线程)解析 pdu,然后封装成task任务,再给到线程池。思考:如果群聊和单聊设计类似(群收到消息后,对每个群成员聊天数量+1),会有什么问题?2) 同一个群 Group_id 对应多个user_id,不同的user_id对应的未读消息数量是不一样的。3)每次发消息时,群消息数量+1,发消息的个人计数也+1。4)未读消息数量 = 群消息数量 - 个人已读消息数量。1)一个群 Group_id 对应多个user_id。
2024-09-10 22:03:13 609
原创 TeamTalk消息服务器(群组相关)
后调用 DB_PROXY::getNormalGroupList 函数。db_proxy_server 收到。
2024-08-31 20:14:10 494
原创 TeamTalk消息服务器学习
该函数直接将数据包转发给db_proxy_server,db_proxy_server有一个map来映射信令所对应的处理函数。msg_id:两个人之间的映射关系。如果按照时间排列,两个客户端之间的时间可能不一样,所以按照序号生成消息id。,msg_server收到后调用 _HandleClientMsgData 函数。CDBServConn::_HandleMsgData 处理消息有三点。信令后调用 _HandleMsgData 函数。客户端A发送消息给客户端B,信令为。
2024-08-29 22:52:32 548
原创 teamtalk文件服务器学习篇
msg_server 处理(== CID_FILE_REQUEST==) 信令,调用 HandleClientFileRequest 函数,转发给 file_server,信令为 (,里面包含了对应的file_server的ip和port地址,以及其他的必要信息,接受方收到后也是要登录file_server。,此时附带了task_id 和 对应的file_server的ip和port地址。真正开始传输文件时先要登录 file_server,使用user 和 task_id,并注明自己的角色。
2024-08-16 23:57:52 899
原创 c++11并发与多线程
第五节 互斥量概念、用法、死锁演示及解决详解(1)互斥量(mutex)的基本概念(2)互斥量的用法(2.1)lock(),unlock()(2.2)std::lock_guard类模板(3)死锁(3.1)死锁演示(3.2)死锁的一般解决方案(3.3)std::lock()函数模板(3.4)std::lock_guard的std::adopt_lock参数第六节 unique_lock详解(1)unique_lock取代lock_guardunique_lock是一个类模板,工作中
2021-11-07 22:57:18 612
原创 C/C++面经
目录C/C++形参和实参(区别、背后实现过程)、返回值内存变量指针和引用语言函数类构造函数拷贝、赋值继承重载运算符关键字const宏定义overload、override、overwrite访问权限volatilestatic转换模板网络编程调试算法?C/C++2、结构体内存对齐问题?形参和实参(区别、背后实现过程)、返回值4、在传递函数参数时,什么时候该使用指针,什么时候该使用引用呢?45、形参与实参的区别?46、值传递、指针传递、引用传递的区别和效率77、C++中的指针参数传递和引用参数传
2021-10-11 22:34:58 747
原创 刷题笔记(9)---排序
目录排序算法冒泡排序迭代递归选择排序迭代递归插入排序希尔排序快速排序(递归)归并排序迭代递归堆排序计数排序桶排序基数排序排序算法冒泡排序迭代递归选择排序迭代递归插入排序希尔排序快速排序(递归)归并排序迭代递归堆排序计数排序桶排序基数排序...
2021-09-20 19:35:47 180
原创 刷题笔记---动态规划
目录动态规划二级目录动态规划入门509. 斐波那契数70. 爬楼梯343. 整数拆分96.不同的二叉搜索树(××)01背包问题416. 分割等和子集(××)494. 目标和(××)474.一和零(××)完全背包问题动态规划二级目录1.确定dp数组(dp table)以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组动态规划入门509. 斐波那契数// An highlighted blockvar foo = 'bar';70. 爬楼梯//
2021-09-09 15:52:37 122
原创 刷题笔记(7)---回溯
目录回溯组合问题77. 组合216. 组合总和 III17. 电话号码的字母组合39. 组合总和40.组合总和II(很重要,未学习)回溯组合问题77. 组合class Solution {private: vector<int> path; // 用来存放符合条件结果 vector<vector<int>> result; // 存放符合条件结果的集合 void backtracking(int n, int k, int sta
2021-08-28 23:27:46 401
原创 刷题笔记(6)---哈希表
目录哈希表二级目录三级目录242. 有效的字母异位词349. 两个数组的交集202. 快乐数1. 两数之和15. 三数之和(没看懂)18. 四数之和哈希表二级目录三级目录242. 有效的字母异位词class Solution {public: bool isAnagram(string s, string t) { int record[26] = {0}; for(int i=0; i<s.size(); ++i) { record[s[i] -
2021-08-26 23:13:56 319
原创 刷题笔记(5)---字符串
目录字符串二级目录三级目录344. 反转字符串541. 反转字符串 II剑指 Offer 05. 替换空格151. 翻转字符串里的单词剑指 Offer 58 - II. 左旋转字符串KMP(未仔细学习过)28. 实现 strStr()字符串二级目录三级目录344. 反转字符串class Solution {public: void reverseString(vector<char>& s) { int l = 0, r = s.size() - 1;
2021-08-26 15:29:30 190
原创 刷题笔记(4)---数组
目录一级目录二级目录三级目录27. 移除元素26.删除排序数组中的重复项一级目录二级目录三级目录27. 移除元素class Solution {public: int removeElement(vector<int>& nums, int val) {/* for(vector<int>::iterator it = nums.begin(); it!=nums.end(); ++it) { i
2021-08-25 20:35:30 537
原创 刷题笔记(3)---二叉树
目录二叉树二级目录110. 平衡二叉树98. 验证二叉搜索树572. 另一棵树的子树104. 二叉树的最大深度二叉树二级目录110. 平衡二叉树链接: 110. 平衡二叉树.class Solution {public: int level(TreeNode* root) { if (root == nullptr) { return 0; } return max(level(root-
2021-08-22 15:51:33 1333
原创 刷题笔记(2)---栈和队列
目录栈和队列栈的用途队列的用途1. 通过stack实现特殊顺序的读取232. 用栈实现队列面试题 03.05. 栈排序“save or later”问题20. 有效的括号3. ⽤stack解决Top-Down结构的问题栈和队列栈的用途可以⽤Stack作为辅助,实现深度优先算法(Depth first search,DFS),或者将递归转为while循环递归本⾝就是相当于把函数本⾝⼀层⼀层加到操作系统的内存栈上⼊栈操作相当于递归调⽤⾃⾝,出栈操作相当于递归返回。队列的用途我们可以⽤Queue作为辅
2021-08-21 23:30:10 234
原创 刷题笔记(1)---链表
目录一级目录链表83. 删除排序链表中的重复元素82. 删除排序链表中的重复元素 II追赶指针技巧876. 链表的中间结点剑指 Offer 22. 链表中倒数第k个节点141. 环形链表142. 环形链表 II一级目录链表83. 删除排序链表中的重复元素链接: 83.删除排序链表中的重复元素.class Solution {public: ListNode* deleteDuplicates(ListNode* head) { if(head == nullptr)
2021-08-21 19:57:56 192
原创 来探一探C++的引用
这里写目录标题创建引用变量引用用作函数参数按值传递与按引用传递使用const的理由引用用作类对象何时使用引用参数创建引用变量1. 引用是已定义变量的别名(另一个名称)。 定义引用的一般格式:类型 &引用名 = 变量名; 例如:int a = 1; int &ra = a; // b是a的别名,因此a和b是同一个单元 注意:定义引用时一定要初始化,指明该引用变量是谁的别名。 2. 引用的主要用途: 2.1 用作函数的形参(主要指结构和对象参数)。通
2021-07-30 15:51:19 107
原创 TCP三次握手和四次挥手------抓包实验
这里写目录标题实验准备与介绍TCP三次握手和四次挥手演示TCP的连接的建立与关闭TCP 三次握⼿异常情况分析TCP 第⼀次握⼿的 SYN 丢包了,会发⽣什么?问题1:我的测试结果是重连了4次,但是内核定义为6,这是为什么呢?实验一小结TCP 第⼆次握⼿的 SYN、ACK 丢包了,会发⽣什么?问题2:我的测试结果是重连了3次,但是内核定义为2,这是为什么呢?实验二小结TCP 第三次握⼿的 ACK 包丢了,会发⽣什么?实验三小结实验准备与介绍阿里云服务器(IP:106.14.165.89)虚拟机客户端(I
2021-07-29 21:28:15 2298
原创 虚函数与多态(一)
这里写目录标题多态静态绑定与动态绑定虚函数虚析构函数虚表指针基类派生类object slicing与虚函数overload、override、overwrite多态1.多态性是面对对象程序设计的重要特征之一。2.多态性是指发出同样的消息被不同类型的对象接收时可能导致完全不同的行为。3.多态的实现: 3.1函数重载 3.2运算符重载 3.3模板 3.4虚函数静态绑定与动态绑定1.静态绑定 绑定过程出现在编译阶段,在编译期就已经确定要调用的函数。 2.动态绑定 绑定过程工作在程
2021-07-26 21:28:05 551
原创 虚继承对C++对象内存模型造成的影响
这里写目录标题回顾类/对象大小计算虚基类表回顾类/对象大小计算虚基类表1.virtual base table 1.1本类地址与虚基类表指针地址的差 1.2虚基类地址与虚基类表指针地址的差 2.virtual base table pointer(vbptr)#include <iostream>using namespace std;class BB{public: int bb_;};class B2 : virtual public BB{pub
2021-07-26 20:25:58 297 2
原创 继承(二)
目录转换与继承派生类到基类的转换基类到派生类的转换多重继承虚继承与虚基类虚基类及其派生类构造函数转换与继承派生类对象也是基类对象。这意味着在使用基类的地方可以用派生类来替换。派生类到基类的转换1.当派生类以public方式继承基类时,编译器可自动执行的转换(向上转换upcasting安全转换) 1.1 派生类对象指针自动转化为基类对象指针 1.2 派生类对象引用自动转化为基类对象引用 1.3 派生类对象自动转化为基类对象(特有的成员消失) 2.当派生类以private/protected
2021-07-26 19:23:20 118
原创 继承(一)
目录代码重用继承公有、私有、保护继承默认继承保护级别接口继承与实现继承继承与重定义继承与组合不能自动继承的成员函数继承与构造函数友元关系与继承静态成员与继承代码重用C++很重要的一个特征就是代码重用。在C语言中重用代码的方式是拷贝代码、修改代码。C++中可以用继承或组合的方式来重用。通过继承或组合现有的类来创建新类,而不是重新创建它们。继承1.继承是使用已经编写好的类来创建新类,新的类具有原有类的所有属性和操作,也可以在原有类的基础上做一些修改和增补。2.新类称为派生类或子类,原有类称为基类或
2021-07-25 22:05:42 154
原创 运算符重载(二)
目录++运算符重载前置++运算符重载后置自增和后置自减的重载!运算符重载赋值运算符重载++运算符重载前置++运算符重载1.成员函数的方式重载,原型为: 函数原型 & operator ++(); 2.友元函数的方式重载,原型为: friend 函数原型 & operator ++(类类型 &);后置自增和后置自减的重载1.成员函数的方式重载,原型为: 函数原型 operator ++(int); 2.友元函数的方式重载,原型为: friend 函数原型
2021-07-25 17:49:08 106
转载 运算符重载(一)---成员/非成员函数重载
目录运算符重载成员函数重载Complex.hComplex.cppmain非成员函数重载Complex.hComplex.cpp运算符重载规则运算符重载1.运算符重载允许把标准运算符(如+、-、*、/、>等)应用于自定义数据类型的对象2.直观自然,可以提高程序的可读性3.体现了C++的可扩充性4.运算符重载仅仅只是语法上的方便,它是函数调用的方式5.运算符重载,本质上是函数重载6.不要滥用重载、因为它只是语法上的方便,所以只有在涉及的代码更容易写、尤其是更易读时才有必要重载。
2021-07-24 09:33:48 1465
原创 对象的使用(三)---mutable/const对象/const成员函数
目录const成员函数const对象mutableconst汇总const成员函数1.const 成员函数不会修改对象的状态2.const成员函数只能访问数据成员的值,而不能修改它const对象1.如果把一个对象指定为const,就是告诉编译器不要修改它2.const对象的定义 2.1const 类名 对象名(参数表); 3.const对象不能调用非const成员函数mutable用mutable修饰的数据成员即使在const对象或在const成员函数中都可以被修改。#in
2021-07-24 08:35:44 238
原创 static与单例模式
目录static与单例模式演示1演示2线程安全的单例模式类的实现static与单例模式1.保证一个类只有一个实例,并提供一个全局访问点2.禁止拷贝演示1#include <iostream>using namespace std;class Singleton{public: static Singleton* GetInstance() { if (instance_ == NULL) { instance_ = new Singleton; }
2021-07-24 08:06:12 357
原创 对象的使用(二)---static关键字
目录static函数用法四种对象的作用域与生存期static用法总结演示2(internal linkage)演示2(external linkage)演示static函数用法#include <iostream>using namespace std;class Date{public: Date(int year) : year_(year) { } static bool IsLeapYear(int year) { return (year % 4 ==
2021-07-24 00:43:21 100
原创 对象的使用(一)---static关键字
目录static成员演示第1条CountedObject.hCountedObject.cppmain演示第6条static成员函数类/对象大小计算static成员1.对于特定类型的全体对象而言,有时候可能需要访问一个全局的变量。比如说统计某种类型对象已创建的数量。2.如果我们用全局变量会破坏数据的封装,一般的用户代码都可以修改这个全局变量,这时我们可以用类的静态成员来解决这个问题。3.非static数据成员存在于类类型的每个对象中,static数据成员独立该类的任意对象存在,它是与类关联的对象,不
2021-07-23 23:14:42 161
原创 构造函数与析构函数(四)---深拷贝与浅拷贝
目录深拷贝与浅拷贝浅拷贝String.hString.cppmain深拷贝String.hString.cppmain赋值操作深拷贝String.hString.cppmain禁止拷贝空类默认产生的成员深拷贝与浅拷贝浅拷贝String.h#ifndef _STRING_H#define _STRING_Hclass String{public: String(const char* str = nullptr); ~String(); void Display();private
2021-07-23 22:19:11 522
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人