自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(94)
  • 收藏
  • 关注

原创 Lua 事件触发机制(注册,触发)

日常工作中经常会用到触发机制,这里就提供一个注册触发机制,在代码中在也不用专门去调用各个模块的接口;只需要触发即可,触发后会自动调用接口直接上代码AddEventListener:注册接口dispatchEvent:触发接口其他的接口都是移除接口。

2023-10-25 16:05:03 775

原创 docker 启动简单的开发环境(mysql, redis, etcd)

image:是启动容器的镜像,如果本地没有该镜像,则会到远程镜像库里去下载,安装不同版本的都只需要改这个参数就可以了。在启动mysql时用到了配置my.cnf,这个可以在网上直接down一个,放在yaml相同的目录。启动:docker-compose -f env.yaml up -d。关闭:docker-compose -f env.yaml down。docker开启容器分为两种,一种是命令启动,一种是用yaml启动。docker的启动yaml启动好后,需要用命令执行yaml。

2023-10-25 14:47:07 471

原创 linux实现基础网络库(socket,epoll,pthread,cmake,pipe, sem,codition,)

客户端命令编译:g++ epollclient.cpp -o client -lpthread。服务器命令编译:g++ epollserver.cpp -o server -lpthread。面试时经常会问到网络库,好久没看过这块知识了,实现一下,用到了一下一些知识点。以下是服务器的编译文件:CMakeLists.txt。以下是客户端的编译文件:CMakeLists.txt。下面是服务器代码:epollserver.cpp。以下是客户端代码:epollclient.cpp。

2023-10-25 14:30:10 327

原创 linux 安装不同版本的C++

配置linux开发环境

2022-06-21 14:47:48 741 1

原创 ftp协议拉去远程文件,并且传送到远端(python)

main.py# 这是一个示例 Python 脚本。# -*- coding: UTF-8 -*-from ftplib import FTPimport osimport datetimeimport sysimport file_opclass FTP_OP(object): def __init__(self, host, username, password, port): """ 初始化ftp :param host:

2022-01-17 17:11:58 732

原创 C++四种类型的强制转换

1. static_caststatic_cast<new_type>(expression)相当于传统的C语言里的强制转换,该运算符把expression转换为new_type类型,用来强迫隐私转换主要用于一下几种用法 1.用于类层次结构中基类和派生类之间指针或者引用的转换 Base* bp = static_cast<Derived*>(dp) 2.用于基本数据类型之间的转换,int->char char a = 'a...

2021-08-25 15:53:09 214

原创 简单实现C++ hashmap(包含iterator)

原理:原理很简单就是数组和链表,数组是用来散列的,链表主要用来存储的,链表的长度超过8个就转为红黑树(没实现)。直接上代码:#include<iostream>#include<string>#include<unordered_map>using namespace std;#define LOADFACTOR 0.75#define EXPANDFACTOR 2template<class Key, class Value>

2021-08-13 15:08:09 946

原创 状态同步和帧同步

一、同步同步就是要多个客户端表现效果是一致的,而且对于大多数的游戏,不仅仅要表现一致,还要客户端和服务器的数据也是一致的。所以同步是个网络游戏概念,只有网络游戏才需要同步,而单机游戏是不需要同步的。二、帧同步帧同步的代表作当属当下最火的手游王者荣耀了吧,它就是帧同步完成的,也意味着它的核心的战斗逻辑写在客户端。帧同步经常被采用在RTS游戏(Real-Time Strategy)中。在游戏中,又客户端给服务器上传玩家的指令,服务器收到指令之后不做任何操作然后转发给...

2021-07-02 15:32:02 5603

原创 etcd 分布式键值数据库

一、etcd介绍ETCD是一个分布式的键值数据库,可以用于服务器的发现,它是基于go语言来实现的。天生就是高可用的键值存储系统,就是为集群化而设计的。etcd试用的算法是Raft算法。Raft算法:是工程上试用最广泛的强一致性、去中i虚拟化、高可用的分布式协议。它是一个公式共识算法,所谓共识就是多个节点对某个事情达成一致看法,即使是在部分节点故障、网络延迟、网络分割的情况下。在分布式系统中,共识算法更多的用于提高系统的容错性。二、特点简单:基于http+json的api让你用curl命令你可

2021-07-01 16:02:19 511

原创 ERROR 2002 (HY000): Can‘t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock‘

遇到这个问题着实让我困扰了很久啊,网上个各种解决方法都没有用,可难受死我了。最后找的这种方法解决了这个问题。1.执行vim /etc/mysql/my.cnf 这个命令你会看到下面的内容## The MySQL database server configuration file.## You can copy this to one of:# - "/etc/mysql/my.cnf" to set global options,# - "~/.my.cnf" to set u...

2021-03-31 19:15:38 178

原创 HTTP请求头和响应头

http协议请求数据包 1.请求行:请求类型/请求资源路径、协议的版本和类型 2. 请求头:一些键值对,一般由w3c定义,浏览器和web服务器之间都可以发送,表示某种特定的含义 3. 空行:请求头和请求体之间用一个空行隔开 4. 请求体:要发送的数据 例如:userNma=123&password=123&returnUrl=//...例如: #Request Headers POST/address HTTP/1.1...

2021-03-23 18:22:06 218

原创 lua中协程的创建和使用

协程协程:协程有三个状态,挂起、运行,死亡协程与多线程情况下得线程比较类似,有自己的堆栈,自己的局部变量,有自己的指针指令,但与其他协同程序共享全局变量等很多信息。线程和协程的主要不同在于:在多处理器情况下,从概念上来讲多线程程序同时可以运行多个线程,而协程是通过协作来完成,在任意指定时刻只有一个协程在运行,并且这个正在运行的协程只有在必要时才会被挂起协程、线程和进程的区别进程是资源分配的最小单位,而线程是程序执行的最小单位,这句话其实并不是完全正确,因为还有比线程还轻量级的存在,那就是协程

2020-11-04 10:29:02 846

原创 实现C++中的Vector

Vector使用模板实现的,里面不仅包含了常用的增删改查,而且包含了迭代器;除了常用的数据类型可以使用之外,自定义的数据类型也可以使用。一下是代码:#include<iostream>#include <stdio.h>#include<assert.h>#include <conio.h>#include<algorithm>#include<vector>using namespace std;tem...

2020-09-23 13:49:28 97

原创 HTTP2.0和HTTP1.0的区别

HTTP2.0的新特性HTTP2.0引入了服务端推送:例如我的网页有一个sytle.css的请求,在客户端收到sytle.css数据的同时,服务端会将sytle.js的文件推送给客户端,当客户端再次尝试获取sytle.js时就可以直接从缓存中获取到,不用再发请求了。新的二进制格式制:HTTP1.0的解析是基于文本,基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑...

2019-09-08 15:49:53 908

原创 HTTP、HTTPS和SSL的加密过程

HTTP协议的特点支持C/S模型(客户端/服务器模型) 简单快速:客户端向服务器请求服务时,只需传送请求方法和路径。请求的方法常用的有GET,POST,HEAD等,每种方法规定了客户端和服务器联系的类型不同。 灵活:HTTP允许传输任意类型的数据对象 无连接:无连接指的是客户端和服务器每一个链接值允许处理一个请求。服务器处理请求收到客户端的回复之后就会断开链接,这种方式可以节省传输时间...

2019-09-02 23:38:01 1089

原创 Linux中的GDB调试

GDB概述linux下的GDB是一个用来调试C和C++程序的强大的调试器,他能在程序运行过程中观察程序的内部结构和内存的使用情况GDB的使用gdb是一个命令行方式的调试工具,在Linux的命令提示如下输入gdb,系统便会启动gdb,也可以在gdb后面给出为文件名,直接指定想要调试的程序,例如:gdb main.c就是开始调试main.c程序。在调试之前,我们需要把可调试的信息装载到可执...

2019-08-31 12:09:27 212

原创 常见排序算法的使用场景和时间复杂度

排序算法的思想冒泡排序思想:从第一个待排序的数开始,和相邻的数两两比较,如果是由小到大的话就和遇到的小的交换,然后继续和后面的比较,直到所有的数据都有序,这样的话最大的数就会浮现到后面去。就像喝汽水时气泡上升的过程。时间复杂度:O(n^2) 最好的时间复杂度O(n) 空间复杂度:O(1)稳定性:稳定查看代码请点下面链接https://blog.csdn.net/ch...

2019-08-30 14:17:47 776

原创 红黑树和AVL树的比较

红黑树和AVL树都是从二叉搜索树进化而来的平衡二叉树。AVL树的特点一个节点的左右子数的高度差不大于1 一个节点的左右子数都是平衡二叉树 平衡二叉树满足二叉树所有的特点AVL树的时间复杂度一颗n个结点的AVL树的平均搜索复杂度是O(logn) 一颗n个结点的AVL树删除一个结点做平衡旋转的时间复杂度是O(logn) 一颗n个结点的AVL树插入一个结点做平衡旋转的时间复杂度是O...

2019-08-29 22:29:14 1777 1

原创 AVL树(平衡二叉搜索树)

为什么出现平衡二叉树树?二叉搜索树查摘和插入的思想和二分查找相似,可以很快的找到目的结点,查找所需的最大次数等同于二叉搜索树的高度。插入的时候也是一样,通过一层一层的比较,最后找到合适的位置。但是,二叉搜索树也有缺点,当需要插入的是一个基本有序或者有序的的序列时,二叉搜索树就会大大降低效率,就如同一个链表一样。插入后的二叉搜索树就会成下面这样,查找的速度和链表差不多所以这...

2019-08-29 11:32:26 147

原创 二叉树搜索树详解

二叉搜索树的特点二叉搜索树:二叉树的每一个结点最多有两个子数的树结构,也就是说除了叶子结点,其余结点最多有两个子节点二叉搜索树的性质若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树二叉搜索树的时间复杂度增:循环遍历每个节点,比较各节点的值,直到找到相应位置,时间...

2019-08-29 10:47:57 560

原创 HTTP中GET和POST的区别

HTTP中的多种请求方法GET:申请获取资源,而不对服务器产生任何影响HEAD:和GET方法类似,不过仅仅要求服务器返回头部信息,而不需要传输任何实际内容POST:客户端向服务器提交数据的方法。这种方法会影响服务器,服务器可能会根据收到的数据动态创建新的资源,也可能更新原有的资源。PUT:上传某个资源DELETE:删除某个资源TRACK:要求目标服务器返回原始请求的内容。它...

2019-08-27 14:41:33 958 1

原创 堆排序

堆排序堆有两种分类,一种是大根堆,一种是小根堆;大根堆父亲节点的值均大于孩子结点的值 构建的这个堆必须是满二叉树小根堆父亲结点的值均小于孩子节点的值 构建的堆必须是满二叉树思想:我们首先必须构建出堆;把数字先像二叉树一样排列好,如下:接下来我们需要调整成为大根堆,从0号位置开始和它的子节点c1和c2比较,和它们中最大的换,接续和下面的孩子比较,如果比孩子小,继续换,...

2019-08-27 12:18:25 135

原创 TCP包头部信息

如果tcp的首部不带任何数据信息的话,通常是20个字节大小。每一个tcp包头部都包含以上的信息,我们详细的来了解一下16位源端口号和16位目的端口号:用来寻找发送端和接收端应用程序,这两个值加上IP首部中的源端IP地址和目的端IP地址唯一确定一个TCP链接。32位序号:序号用来标识从tcp发端向tcp收端发送的数据字节流,它表示在这个报文段中的第一个数据字节。如果将字节流看成是在两...

2019-08-26 11:11:13 1132

原创 智能指针详解

什么是智能指针?智能指针就是用一个类来封装一个指针 主要负责自动的来释放内存,防止发生内存泄漏智能指针的思想 智能指针中存储的是指向动态对象的指针,用于动态对象生存周期的控制,能够确保自动且正确的销毁动态对象,防止内存泄漏。智能指针的主要作用就是利用栈智能指针离开作用域的时候调用析构函数释放资源。下面我们介绍四类智能指针auto_ptrauto_ptr是C++...

2019-08-25 13:05:18 271

原创 浅拷贝,深拷贝,写时拷贝

浅拷贝思想:我们用指针p申请了一块内存空间,在用指针q指向了这一片内存空间,这时候这两个指针指向的是同一个内存空间,当需要释放这块内存空间的时候p会释放一次,q也会释放一次,这样重复释放就会引发程序的崩溃。我们通过一段代码来理解浅拷贝class Person{public: char* name; int age; ~Person() { if (name != NU...

2019-08-21 20:55:52 114

原创 找数组中前K小或者前K大

思路:我们在这里用到一个快排的思想,快排一次得到位置pos,在这个pos之前的数据全比和比较的数小(或者大),它后面的数全比和比的数大(或者小),如下图,快排第一次用6来和其他数比较,排序一次之后,在6之前的数字一定会比6小,在6之后的数字一定会比6大。如果你要找第3小则需要在6前面找,就要执行quicksort(arr, left, index, k);反之,找第7小的话,就需要在6后面...

2019-08-14 19:55:22 268

原创 内联函数和宏定义

内联函数内联函数和普通函数相比可以加快程序运行的速度,因为不需要中断调试,在编译的时候内联函数可以直接被镶嵌到目标代码中去。而宏只是简单的替换。内联函数有参数的类型检查,而宏没有类型检查。inline是指嵌入代码,就是在调用函数的地方不是跳转,而是把代码直接写到那里去。对于短小的代码来说,inline增加空间消耗换来的是效率提高,这方面和宏是一模一样的,但是inline在和宏相比没有付...

2019-08-11 12:31:18 141

原创 sizeof()和strlen()的区别

sizeof和strlen的区别1.sizeof是运算符,strlen是函数2.sizeof可以用类型做参数,而strlen只能用char*做参数,且必须是以'\0'结尾的,sizeof还可以用函数做参数例如:short fun();printf("%d\n",sizeof(f()));输出的结果是sizeof(shotr) ,等于23.数组所谓哦sizeof的参数不退化...

2019-08-11 12:04:00 125

原创 git基础使用

1.git安装在官网下在一个安装包,点击安装会弹出下面的界面,跟着我的选择选就欧克,点击下一步当遇到这个界面的时候需要改动,本来是选择的是第二个,现在改成第一个,然后继续点击next就可以安装完成2.创建SSH密钥在这里你需要创建一个本地的git文件存储目录现在打开刚才安装的github客户端,进入到你创建的这个文件下,然后输入命令,后面的邮箱改成你自己注册时用的邮...

2019-08-07 16:00:16 131

原创 生产者和消费者代码实现

信号量实现生产者和消费者模型 有一块固定容量的缓存区,有多个线程同时访问或操作这个块缓存区,而此时,一个线程称为生产者,生成数据到这块缓存,另一个线程消费者从这个块缓存里读取数据,这个过程就可能引发一系列线程安全问题。而解决问题的关键就是,使消费者和生产者同时只能有一个线程访问这块缓存,也就是说它们之间是互斥的。方法一:信号量信号量设置的初始值可以不为1,假设一开始设置信号...

2019-08-05 21:26:39 1656

原创 线程同步之信号量

信号量的头文件 #include<semaphore.h>信号量不像条件变量那样不是锁,信号量是锁,是互斥锁的加强版。pthread_mutex_t mutex;这个互斥锁lock(),mutex == 0,unlock(),mutex==1;线程间访问共享资源是串行的。信号量 sem_t sem; 信号量设置的初始值可以不为1,假设一开始设置信号零的初始值为3;当第一...

2019-08-05 21:08:04 626

原创 线程同步之条件变量

1.条件变量是锁吗? 不是锁,但是条件变量能够阻塞线程条件变量需要和互斥锁一起使用 互斥量:保护一块共享数据 条件变量:引起阻塞2.条件变量的两个动作?当条件满足,通知阻塞的线程线程开始工作 条件不满足,阻塞线程3.条件变量的类型 pthread_cond_t;4.主...

2019-08-04 21:30:01 329

原创 线程同步之读写锁

1.读写锁是几个锁? 一个锁。pthrad_rwlock_t lock;2.读写锁的类型 读锁:对内存做读操作 写锁:对内存做写操作3.读写锁的特性 线程A加读锁成功,又来三个线程做读操作,可以加锁成功 多个线程在读的时候可以共享,可以并行去处理 线...

2019-08-04 14:19:30 202

原创 线程同步之互斥锁

互斥锁是我们用来解决线程同步的一种常用方法,它的头文件在#include<pthread>中1.互斥锁的创建pthread_mutex_t mutex;2.创建完成之后需要初始化pthread_mutex_init( pthread_mutex_t* mutex; const pthread_mutexattr_t att...

2019-08-04 14:08:35 236 1

原创 线程同步之死锁

什么是死锁呢? 死锁就是多个进程或者线程访问同一个资源的时候,谁也抢不到资源,谁也不退让让其他进程或者线程访问,用户看到的就是程序卡住了。举个例子吧,在一个没有红绿灯的十字路口,来了四辆小汽车,每个路口都只能让一个汽车通过。现在这种情况四辆车都过不了汽车,这就发生了死锁。发生死锁的原因?第一种情况是重复加锁,在这种情况下,第二个锁到来的时候,发现有锁了,那就...

2019-08-04 13:33:19 113

原创 linux线程的创建与使用

创建进程的函数函数原型: int pthread_create( pthread_t *thread, //线程ID=无符号长整形 const pthread_attr_t *attr, //线程属性 void *(*start_routine)(void*), //函数指针...

2019-08-03 14:05:22 9105

原创 进程间通信之——管道

进程间通信(inter process communite)之管道1.管道的分类有名管道、没有血缘关系的进程间通讯fifo() 无名管道、只能进行父子进程间的通讯pipe() 不管是有名管道还是无名管道都是往内核中写数据2.管道的实现:环形队列3.管道的大小:4K4.局限性:数据只能读取一次,不能重复读取,头指针write在前面写,尾指read在后面读,循环读5.模式...

2019-08-02 11:22:37 157

原创 同名函数的三种关系(重载,隐藏,覆盖)

1.重载函数名相同 作用域相同 函数参数不同class Base{public: //这两个函数构成重载 void show() { cout << "Base::void show()" << endl; } void show(int i) { cout << "virtual void show(int i )" &lt...

2019-08-01 21:01:51 3858

原创 括号生成问题

括号生成需要出现成对的括号(有效的括号)例如:给出n = 3,则生成的结果是[ "((()))", "(()())", "(())()", "()(())", "()()()" ]给定n的值,左边的括号"("数量一定会小于n,当然右边的括号")"数量也一定小于n,左边的值加一,则打印一个"(",右边的值加一,打印一个")",当左括号和右括号的数量等于n时,那就打印...

2019-08-01 14:32:09 336

原创 守护进程详解

1.守护进程的概念:系统中的后台进程,周期性的执行某些任务,或者等待某个事件的发生,不会随用户的注销而退出特点:后台服务进程,不会显示在终端,除了关机和kill,守护进程是不会死的 独立于控制终端 周期性执行某任务 不受用户登录注销影响 守护进程一般采用以d结尾的名字(服务)2.进程组 1.进程组的长?...

2019-07-31 14:57:13 2604 2

docker 启动简单的开发环境(mysql, redis, etcd)

docker安装mysql时用到的配置文件

2023-10-25

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除