- 博客(48)
- 收藏
- 关注
原创 EventLoopThread
EventLoopThread1 类图任何一个线程只要创建并运行了EventLoop都是IO线程IO线程不一定是主线程(IO,逻辑运算)EventLoopThread创建了一个线程在线程函数中创建一个EventLoop::loop开启事件轮询#include <EventLoopThread.h>继承自 noncopyable .[图例]Public 类型typedef boost::function< void(EventLoop *)>
2022-01-25 16:13:42
700
原创 1 python使用Protobuf和golang使用protobuf+grpc
1 python使用Protobuf和golang使用protobuf$ python -m pip install grpcio #安装grpc$ python -m pip install grpcio-toolssyntax = "proto3";message HelloRequest { string name = 1; // name表示名称,编号是1}生成protobuf的python文件$ python -m grpc_tools.protoc --python_out
2022-01-21 16:04:56
2412
原创 muduo网络库net源码逐行分析_1
1 muduo::net::EchoServer类 参考EchoServer类 参考EchoServer 的协作图:[图例]Public 成员函数EchoServer (EventLoop *loop, const InetAddress &listenAddr)voidstart ()Private 成员函数voidonConnection (const TcpConnectionPtr &conn)voidonMe
2022-01-17 10:08:24
556
原创 go调用Mongdb注册回调函数(mongo-driver/mongo)
ServerMonitor表示为不同的服务器事件触发的监视器。 客户端将监视它所连接的MongoDB部署的变化,这个监视报告在客户端表示部署的变化。总体部署,和心跳被发送到单个服务器,以检查它们的当前状态。mongodb提供检测服务器得非阻塞式的接口type ServerMonitor struct { ServerDescriptionChanged func(*ServerDescriptionChangedEvent) ServerOpening func(*Ser
2022-01-13 15:11:53
623
原创 python调用C++cTypes
在python中调用C++自定义函数以及库函数cTypes1 无返回值的字符串传递c++语法 type.cpp#include <stdio.h>#include <wchar.h> // 宽字符extern "C" void TestStringA(const char* str,int size){ printf("TestStringA %s size = %d\n",str,size);}用makefile编译出动态库testctypes:type.c
2022-01-12 11:51:54
366
原创 muduo网络库base源码分析2
1 线程安全的单例模板类实现静态 Public 成员函数static T &instance () 用于返回单例对象静态 Private 成员函数static voidinit () 用于创建单例对象static voiddestroy () 用于销毁单例对象静态 Private 属性static pthread_once_tponce_ = PTHREAD_ONCE_INIT 能够保证一个函数只会被调用一
2022-01-06 17:28:53
466
原创 muduo网络库base源码详细分析
1 muduo网络库的目录结构/muduo$ tree ./ -L 2./├── BUILD.bazel├── build.sh├── ChangeLog├── ChangeLog2├── CMakeLists.txt├── contrib│?? ├── CMakeLists.txt│?? ├── hiredis│?? └── thrift├── muduo├── README└── WORKSPACE……muduo库主体代码├── muduo│ ├── base
2022-01-04 14:55:26
389
原创 muduo网络库base详细源码分析
1 muduo网络库的目录结构/muduo$ tree ./ -L 2./├── BUILD.bazel├── build.sh├── ChangeLog├── ChangeLog2├── CMakeLists.txt├── contrib│?? ├── CMakeLists.txt│?? ├── hiredis│?? └── thrift├── muduo├── README└── WORKSPACE……muduo库主体代码├── muduo│ ├── base
2022-01-04 14:25:40
1100
原创 libevent 配置类详解
event_config_new 配置文件配置项event_base_config_flag和event_config_set_flag先看event_base_config_flag按优先顺序排列的后端数组static const struct eventop *eventops[] = {#ifdef EVENT__HAVE_EVENT_PORTS &evportops,#endif#ifdef EVENT__HAVE_WORKING_KQUEUE &kqops,
2022-01-01 18:43:17
562
原创 1 muduo网络库的目录结构和代码实现细节
1 muduo网络库的目录结构/muduo$ tree ./ -L 2./├── BUILD.bazel├── build.sh├── ChangeLog├── ChangeLog2├── CMakeLists.txt├── contrib│?? ├── CMakeLists.txt│?? ├── hiredis│?? └── thrift├── muduo├── README└── WORKSPACE……muduo库主体代码├── muduo│ ├── base
2021-12-23 21:08:28
961
原创 bufferevent_filter_new对缓冲区数据过滤(解压加密)
bufferevent_filter_new对缓冲区数据的过滤器struct bufferevent *bufferevent_filter_new(struct bufferevent *underlying, bufferevent_filter_cb input_filter, bufferevent_filter_cb output_filter, int options, void (*free_context)(void
2021-11-25 20:18:03
316
原创 libevent的http服务详解
libevent的http服务详解即远程调用,得到一个call ID然后验证外部远程参数evrpc_request_cb(struct evhttp_request *req, void *arg){ struct evrpc *rpc = arg; // 用来自动解析缓冲区数据的,外部验证参数也是从这里过来的 struct evrpc_req_generic *rpc_state = NULL; // 会模拟一个钩子,在等待事件的到来 if (req->type !=
2021-11-25 19:54:30
2154
原创 libevent缓冲区实例
bufferevent读、写、回调和读低水位、读取高水位、写入低水位读取低水位,假设设置为0,就意味着只要数据来了,就读,至于读多少,取决于client发送的包体有多大。再比如,如果规定字节是100个,只来了90个,那也不会回调,可能是数据包发错了,这是私有传输协议之间的规定。读取高水位,输入缓冲区中的数据量假设到了100个字节。bufferevent将停止读取,直到数据量低于100个,会阻塞。等于限定了一个条件,最大处理的最大数据量,一次发来1024个字节,如果每次只读取102.4就切成了十份。
2021-11-25 11:12:36
545
原创 libevent使用socket实例
使用socket实例使用宏把文件描述符封装了一层#define evutil_socket_t intevutil_socket_t listen_socket = socket(AF_INET, SOCK_STREAM, 0);一次性将bind listen全部完成evconnlistener *ev = evconnlister_new_bind(base list_cb,
2021-11-24 19:48:37
2296
翻译 raft算法
consul微服务架构运用了raft算法节点状态假设有三个节点ABC节点处于任意状态追随者 领导者 候选人所有节点启动时都是处于一个follower状态,在一段时间内如果没有收到来自领导者的心跳包,都会从follower转换成candidate状态。哪个节点做leader是大家投票选举出来的,每个leader工作一段时间,然后选出新的leader继续负责。这根民主社会的选举很像,每一届新的履职期称之为一届任期,在raft协议中,也是这样的。选举步骤如下增加节点本地的任期,切到
2021-11-24 16:08:21
137
原创 共享内存实现原理
/*创建一个共享内存区key值可以由ftok()函数生成,是唯一的进程资源*/int main(){ int shmid; char *addr; shmid = shmget(1002, 128, IPC_CREAT|IPC_EXCL|0666); addr = (char* )shmat(shmid, NULL, 0); strcpy(addr,"hello world"); return 0;}/*IPC_CREA
2021-11-21 00:21:05
909
2
原创 C语言实现哈希算法判断该字符串是否出现在数组当中,如果出现,它的下标是多少?
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXKEY 10int hash(char *key) { int h = 0, g; while (*key) { h = (h << 4) + *key++; g = h & 0xf0000000; if (g) h ^= g >
2021-11-12 21:49:24
718
原创 Linux网络通信调试命令
1 telnet命令telnet可以检测指定的IP和端口号的监听服务是否存在。$ telnet 127.0.0.1 6000Trying 127.0.0.1...Connected to 127.0.0.1.Escape character is '^]'.监听本地回环和6000端口是否开启了监听。如果不指定端口号,默认是23使用telnet命令还可以正常和服务器进行交互,比如163邮箱使用的是stmp协议端口25,网上很多教程,可以通过stmp协议实现发送邮件,不过多赘述。2 net
2021-11-09 22:59:41
2279
原创 C++快速排序
快速排序双指针递归,假设以小明为目标,将其的成绩排名第几,在全班中求出i和j同时,一个往左,一个往右如果key(小明的成绩) <(data[j]) 小于其他同学while (i < j&&key < data[j]) { j--; }就将大于的成绩的同学的位置,原封不动,将其指针往左移动直到,终于有一个不满足 key<data[j]了得到一个同学的成绩是小于小明的,那么data[i] = data[j]; // 将当前小明的成绩的
2021-10-23 23:43:44
94
原创 希尔排序C++
希尔排序希尔排序利用了插入排序的两个特点元素越少,排序效率越高,越接近有序,效率越高希尔排序的不稳定性 int arr[] = {4,1,2(1),2(2),5}; // 在经过排序后可能造成 int arr[] = {4,1,2(2),(2),5};第一个2,会排序在第2个后面的情况int xiersort(int *data,int length) { int gap = 0; int i = 0; int j = 0; for (gap = lengt
2021-10-23 15:40:32
107
原创 boost库::asio库的TCP连接以及类详细摘要
asio库的简明笔记boost库作为C++准标准库,特别是类摘要写的极其规范和简明,是一个榜样。1 头文件#include <iostream>#include <boost/array.hpp>#include <boost/asio.hpp>using boost::asio::ip::tcp;2 boost::asio::io_service类负责事件的处理class io_servie :private nocopyable // 不可拷贝,将
2021-10-17 21:57:04
2791
原创 CMake学习笔记
.├── CMakeLists.txt├── libhello│ ├── CMakeLists.txt│ ├── hello.cpp│ └── hello.hpp└── src ├── CMakeLists.txt └── main.cpp2 directories, 6 files1 单层文件存放头文件和实现文件src下CMakeList.txtinclude_directories()# include_directories 用来指明该cmakeL
2021-10-15 15:28:22
205
原创 C++封装log4cpp
封装__FILE__时,没有考虑所处函数行数,所以有需要可自行修改封装该函数。void add(string &s)#include <log4cpp/BasicLayout.hh>#include <log4cpp/SimpleLayout.hh>#include <log4cpp/PatternLayout.hh>#include <log4cpp/OstreamAppender.hh>#include <log4cpp/FileA
2021-06-03 21:59:14
460
原创 C++实现string[]重载区分读写
string类型的最重要技术实现是引用计数和浅拷贝。写时复制,读时共享,类似于fork()函数,来创建子进程。temp String::operator[](size_t idx){ return temp(*this, idx);}//---------------------1------------------------实现方法: 1:将[]重载延时发动,通过传入一个对象的形式,把[]和=抽离开来 2:遇到=重载,就是写操作,否则是读操作 3:传递回一个中间对象temp,并
2021-06-03 21:24:26
367
2
原创 C++vector容器源码分析
vector源码解析//继承关系class vector : protected _Vector_base<_Tp, _Alloc> ;emplate <class _Tp, class _Alloc> class _Vector_base {}template <class _Tp, class _Allocator>class _Vector_alloc_base<_Tp, _Allocator, true> {public: typ
2021-06-03 20:19:15
1180
原创 C++、stl空间配置器源码实现
在C++中所有STL容器的空间分配其实都是使用的std::allocator,它是可以感知类型的空间分配器,并将空间的申请与对象的构建分离开来。stl的空间配置器运用了链表+内存池和分级控制的技术。对象池简易实现struct __allocator{ _Alloc __underlying_alloc; typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Tp* pointer
2021-06-02 10:46:40
185
原创 C++对象内存池的优化和嵌入式指针
一:嵌入式指针(embedded pointer)一般应用在内存池相关的代码中; 成功使用嵌入式指针有个前提条件:(类A对象的sizeof必须不小于4字节)嵌入式指针工作原理:借用A对象所占用的内存空间中的前4个字节,这4个字节用来作为链表的next指针域;但是,一旦某一块被分配出去,那么这个块的 前4个字节 就不再需要,此时这4个字节可以被正常使用;sizeof()超过4字节的类就可以安全的使用嵌入式指针,因为,在当前的vs2017环境下,指针的sizeof值是4针对单个对象的内
2021-05-07 18:58:47
352
原创 内存池——new、delete运算符重载
#include<iostream>using namespace std;namespace _nm{ void func() { char *pArr = new char[10]; memset(pArr, 0, 10); delete[] pArr; }}int main(){ _nm::func(); getchar();}[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CE19gzB8-1620299511649)
2021-05-06 19:17:29
440
2
原创 C进程池实现文件的传输
工作流程图头文件声明prool.h#include <stdio.h>#include<sys/sendfile.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <sys/stat.h>#include <unistd.h>#include <sys/types.h>#include <sys/wa
2021-05-05 21:21:26
213
原创 C语言线程池实现并行下载上传,匹配百度网盘功能
1:数据库的设计与框架大纲百度网盘的功能实现,肯定是需要借助数据库存储文件信息,和用户信息的,以及多点下载和反向代理、负载均衡。打算手撕一波百度网盘来过过瘾。设计的主要关键点在于数据库表的设计,我需要用到一个虚拟文件系统,用户根据owner_id来改变当前的工作目录和对自己的文件进行增删查改。 ls cd pwd puts filename gets filename mkdir filename rm filename 文件秒传 用户注册验证 VIP功能 日志功能 待
2021-05-04 16:27:44
1883
原创 C语言线程池文件的并行下载文件
线程池线程池的特点就是尽量减少创建和销毁线程的开销,缺点是不利于保护共享资源。现在公司用的多都是封装好的线程池,比如qt框架的QThread::QThread(QObject *parent = Q_NULLPTR)。这一方面带来好的好处就是少了很多造轮子的过程,qt是我见过帮助文档最好的框架了,但是手撕线程池的也能让自己对其内部实现更加清晰。在Linux下线程和进程其实是同一种东西。**struct task;的结构体,fork()和pthread_create()虽然是不同的函数,但是在内部实.
2021-04-25 12:40:03
518
原创 C++多态坑点的实现机制
先上两个简单的父类子类。class Base{public: void func() { cout << "Base……" << endl; } virtual void func1(int value = 1) { cout << "Base 虚函数 value =" << value << endl; }};class Derive : public Base{public: void func() {
2020-08-14 15:24:17
150
原创 C++虚函数调用分析
上一个简单的类。#include <iostream>using namespace std;class A{public: virtual void func() { cout << "虚函数" << endl; func2();//此处断开 } virtual void func2() { cout << "虚函数2" << endl; }};主函数调用int main(){ A a; A *pa
2020-08-13 16:50:05
322
原创 Nginx守护进程的写法简要
守护进程是一种长期运行的进程,这种进程在后台运行,不跟任何控制终端关联一般跟随操作系统启动,生存期长(一般)守护进程跟黑窗口无关联./这种命令在后台运行的概念,不会站着终端,PPID为0,都是内核进程,跟随系统启动,贯穿整个系统cmd 列[]都是内核守护进程;init:也是系统守护进程,负责启动各运行层次特定的系统服务,也负责收养孤儿进程cmd列中,不带[],都是普通守护进程,系统日志,往往自成一组守护进程编写规则umask是一个函数,用来屏蔽一些权限fork()一个子进程,父进程退出,
2020-08-12 15:16:13
1475
原创 C++单例模式实现(多线程)
在多线程环境下,往往开了2个以上的子线程去争夺一个对象的new。这种需要读写的代码,必然要用到互斥量。#include "stdafx.h"#include<iostream>#include<thread>#include<mutex>using namespace std;mutex resource_mutex;//互斥量MyCAS *MyCAS::m_instance = NULL;//初始为空class MyCAS{public: sta
2020-08-09 15:57:09
870
1
原创 C++抽象工厂模式再探讨
抽象工厂模式最大的好处是,易于交换,在一个应用中只需要new出一个抽象工厂,提供实例化,就可以根据需求改变工厂,生成不同的产品配置,而且还可以更新数据的访问。与此同时,产品的具体类名也被具体工厂实现分离了,不会出现在客户端代码。两个层次都依赖于抽象层,更灵活地运用了多态。抽象工厂很方便数据的更新,也运用了依赖倒转原则和开闭原则,但是在增加功能的同时,需要运用更多的代码量,也对抽象的工厂,增加了一部分代码。给具体实现的工厂类,也需要进行改动。#include<iostream>#incl
2020-08-09 10:15:52
108
原创 C++抽象工厂模式实现
用一段数据访问,只有ID和name的简单字段来做个探讨。class User{public: User(); User(int id, string name) :name(name), id(id){}private://需要获得用户的ID和名字 int id; string name; };用于操作User类的。class SqlserverUser{public: void Insert(User user); User GetUser(int id); };
2020-08-08 17:20:18
107
原创 C++外观模式实现
在面向对象设计之初,要有意识地将两个不同的层次分离。要尽量减少他们的依赖的同时,又要符合开闭原则。尤其是,一些难以维护的老系统,直接去改和拓展功能,都是一种爆炸性的问题,只需要开发一个与老系统交互的,另一个只需要了解这个接口,直接开发新系统,调用这些接口就完事了。class SubSystemOne{public: void MethodOne() { cout << "系统函数 : 1 " << endl; }};class SubSystemTwo{pu
2020-08-07 17:06:44
98
原创 C++模板方法模式实现
模板方法模式比较容易理解,是有效地提高了代码地复用率,在父类模板中定义一个大的算法架子,用来抽象化,逻辑的实现都堆到子类中去重写这些方法。客户端只需要认识一个类即可。class AbstractClass//抽象的模板类{public: virtual void PrimitiveOperation1() {}//抽象方法 virtual void PrimitiveOperation2() {} void TemplateMethod() { PrimitiveOperation1()
2020-08-05 16:29:34
180
原创 C++装饰模式实现
装饰模式是对对象进行一个包装,这样每个装饰对象的实现就和如何使用这个对象分离开了,每个装饰只关心自己的实现功能,不需要关心如何被添加到对象链中。class Person{public: Person() {} Person(string name) :name(name) {}; // 初始化列表 virtual void show() { cout << "装扮的" << name << endl; }private: string name;};
2020-08-04 17:13:56
238
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人