EventLoopThread EventLoopThread1 类图任何一个线程只要创建并运行了EventLoop都是IO线程IO线程不一定是主线程(IO,逻辑运算)EventLoopThread创建了一个线程在线程函数中创建一个EventLoop::loop开启事件轮询#include <EventLoopThread.h>继承自 noncopyable .[图例]Public 类型typedef boost::function< void(EventLoop *)>
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
muduo网络库net源码逐行分析_1 1 muduo::net::EchoServer类 参考EchoServer类 参考EchoServer 的协作图:[图例]Public 成员函数EchoServer (EventLoop *loop, const InetAddress &listenAddr)voidstart ()Private 成员函数voidonConnection (const TcpConnectionPtr &conn)voidonMe
go调用Mongdb注册回调函数(mongo-driver/mongo) ServerMonitor表示为不同的服务器事件触发的监视器。 客户端将监视它所连接的MongoDB部署的变化,这个监视报告在客户端表示部署的变化。总体部署,和心跳被发送到单个服务器,以检查它们的当前状态。mongodb提供检测服务器得非阻塞式的接口type ServerMonitor struct { ServerDescriptionChanged func(*ServerDescriptionChangedEvent) ServerOpening func(*Ser
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",str,size);}用makefile编译出动态库testctypes:type.c
muduo网络库base源码分析2 1 线程安全的单例模板类实现静态 Public 成员函数static T &instance () 用于返回单例对象静态 Private 成员函数static voidinit () 用于创建单例对象static voiddestroy () 用于销毁单例对象静态 Private 属性static pthread_once_tponce_ = PTHREAD_ONCE_INIT 能够保证一个函数只会被调用一
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
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
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,
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
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
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 !=
libevent缓冲区实例 bufferevent读、写、回调和读低水位、读取高水位、写入低水位读取低水位,假设设置为0,就意味着只要数据来了,就读,至于读多少,取决于client发送的包体有多大。再比如,如果规定字节是100个,只来了90个,那也不会回调,可能是数据包发错了,这是私有传输协议之间的规定。读取高水位,输入缓冲区中的数据量假设到了100个字节。bufferevent将停止读取,直到数据量低于100个,会阻塞。等于限定了一个条件,最大处理的最大数据量,一次发来1024个字节,如果每次只读取102.4就切成了十份。
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,
raft算法 consul微服务架构运用了raft算法节点状态假设有三个节点ABC节点处于任意状态追随者 领导者 候选人所有节点启动时都是处于一个follower状态,在一段时间内如果没有收到来自领导者的心跳包,都会从follower转换成candidate状态。哪个节点做leader是大家投票选举出来的,每个leader工作一段时间,然后选出新的leader继续负责。这根民主社会的选举很像,每一届新的履职期称之为一届任期,在raft协议中,也是这样的。选举步骤如下增加节点本地的任期,切到
共享内存实现原理 /*创建一个共享内存区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
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 >
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
C++快速排序 快速排序双指针递归,假设以小明为目标,将其的成绩排名第几,在全班中求出i和j同时,一个往左,一个往右如果key(小明的成绩) <(data[j]) 小于其他同学while (i < j&&key < data[j]) { j--; }就将大于的成绩的同学的位置,原封不动,将其指针往左移动直到,终于有一个不满足 key<data[j]了得到一个同学的成绩是小于小明的,那么data[i] = data[j]; // 将当前小明的成绩的
希尔排序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