- 博客(35)
- 资源 (2)
- 收藏
- 关注

原创 C++网络库都干了什么?——CppNet
虽然市面上已经有很多成熟的网络库,但是编写一个自己的网络库依然让我获益匪浅,这篇文章主要包含:Tcp网络库需要有哪些功能,编写时需要注意哪些问题,CppNet是如何解决的。 大家都知道操作系统原生的so...
2019-08-24 19:57:52
2768
5

原创 IOCP 详解
IOCP 详解一直有写一个网络库得想法,现在终于得以实现。 关于网络库需要的组件,前边已经写了内存指针,线程模型,消息队列,智能指针,时间管理,后边还会有环形缓存的实现介绍。我想实现的网路库只支持TCP协议,采用单进程多线程模型,只实现两个平台的版本,一个是基于epoll的Linux版本,一个是基于IOCP的Windows版本。网络上关于epoll的介绍资料多如牛毛,大多数已经讲解的非常细致...
2018-07-16 09:30:36
7582
原创 研发效率之殇
你是否在加班的深夜也曾疑惑,软件开发到底是一份什么样的工作?为什么明明是脑力劳动,却像体力劳动一样需要透支体力?为什么大家都在拼命赶工,交付日期却像地平线般永远无法抵达?当第N次为临时需求修改数据库字段时,我突然意识到:这场困局的根源,藏在比技术债务更深的地方。
2025-03-02 17:51:43
865
原创 什么是可观测性?
当系统复杂到一定程度的时候,其线上会出现故障不是偶然而是必然,这就必须要有一种机制来进行线上的系统监控和实时诊断,甚至能够进行运营分析,那就不得不使用可观测性,即使其会引入额外的开发复杂度,增加额外的开发周期。通过上述的几个模块,我们可以知道一个可观测性平台已经是一个复杂的项目,如果企业有能力自建可观测平台,自然是一个最好的选择,因为通过第一节中什么是可观测性的讨论,我们已经知道要获取可观测性,需要很大程度的入侵现有代码,业务方需要埋点,需要引入SDK. 需要输出特征日志。
2025-02-07 21:43:46
579
原创 如何做好技术Leader
遇到事情,不要只在后面push,大喊给我上,而能做到站在队伍头儿上,大喊跟我上。用我们开发代码来举例子,需求落地有一万种方式,而哪种方式最好,最容易维护,效率最高,这几乎不可能被有效的追踪,很大程度上依赖员工的自觉程度,其用心多,思考深,则效果好,其混日子,好摸鱼,虽非最优方案,但需求也能落地,只是为以后埋雷。汤姆索亚历险记里有个很好的例子:小汤姆的姨妈让他用油漆刷院子里的栅栏,这本来是一件枯燥的苦差使,但汤姆灵机一动,装作很陶醉痴迷的样子来刷栅栏,引得小伙伴们纷纷要体验一下,最终以物相易,才能换得机会。
2025-01-22 22:31:30
784
原创 架构设计实战--数据转换服务
首先,入向的adapter会启动自己的io线程来监听请求的到来,不论是从 kafka 这类 message queue 接收数据,还是开放http接口来接收数据,java的一般做法会在controller启动一系列的io线程来阻塞监听请求的到来,其底层大多是netty之类的nio,其内部有自己的线程池维护逻辑,没有对外暴漏出来,所以一般也不会在这些IO线程里原地执行业务逻辑。这样的场景正合适六边形的服务架构。以上是一个真实的服务内部架构的设计,我删除掉了一些业务相关的内容,但整体的设计思路没有受到影响。
2025-01-22 22:21:59
914
原创 如何实现可靠UDP传输
既然已经有TCP了,为什么还需要UDP可靠?TCP是强制的可靠性传输,其在IP协议的基础上,发送端对所有的数据进行定时重传,接受端对所有的数据进行排序,以此(当然还有很多其他的机制)来实现发送端是什么样子的,接受端就能接受到什么样子的数据。但是现实中有一些场景,我们并不需要如此固执的可靠性。对于FPS游戏这种时效性要求非常高的游戏中,玩家最关心的是自己的射击结果和角色的存活与否,当有一个手雷扔...
2020-04-12 15:18:10
813
原创 C++服务器研发精进
转眼间已经工作四年有余,回想自己从毕业到现在,迷茫和焦虑往往是萦绕不去的情绪。工作上虽算是有所进步,但自己的职业生涯,技术路线却一直苦于无师可询,摸着石头过河是常态,兜兜转转浪费了不少时间。今天写文记录下自己的技术感悟,斗胆以进阶做名,也是希望对同样迷茫的同行有所启发或共鸣。我现在应该算是C++服务器开发的领域,所以主要说下关于C++服务器开发的相关进阶:服务器开发主要有四块儿的知识领域:计...
2019-11-10 13:15:41
1473
2
原创 如何通过Docker安装Wordpress?
本文主要介绍如何在Contos 7环境中,通过docker 安装配置 wordpress,网上的资料虽然多如牛毛,但多数是拾人牙慧,未经实践。安装docker第一步首先是安装docker,如果之前系统中已经安装过的话可以直接略过此步骤。我们直接通过 yum 安装:yum install docker启动docker安装成功之后直接启动dockerservice docke...
2019-11-02 12:29:13
475
原创 如何高效的管理缓存?——LoopBuffer
我们需要一种缓存结构,可以未预知数据大小的情况下高效的管理内存。每次数据到来的时候都能保证有效的写入,即使动态的扩展内存也不会对原有的数据进行任何挪移操作。读取数据的时候只能顺序的读取,也不会对未读取到的数据进行移动。 CppNet的数据流缓冲通过CBuffer类来实现,实际的数据存储在CLoopBuffer中,loop buffer实现如其名,通过在一块固定大小的内存上移动指针来实现顺序...
2019-08-31 18:38:44
1187
原创 Envoy 源码分析(三) --------event
Envoy 源码分析(二) ——–eventEnvoy的网络部分用的是libevent,所以其事件部分也是对libevent接口的封装。libevent首先在libevent中对libevent的几个基础组件做了包装,封装为自动析构的智能指针类型typedef CSmartPtr<event_base, event_base_free> BasePtr;typed...
2018-09-28 21:05:35
864
原创 Envoy 源码分析(二) --------buffer
Envoy 源码分析(二) ——–bufferEnvoy的buffer实现基于Libevent的evbuffer,在evbuffer的基础上做了一些简单的封装,如果对evbuffer不甚了解的话,可以查看下这个blog:https://blog.csdn.net/windeal3203/article/details/52864994BufferFragmentImpl这个类非常简...
2018-07-21 16:35:00
1097
原创 Envoy 源码分析(一) --------common
Envoy 源码分析(一) ——common源码的目录结构在上一篇文章中已有说明:https://blog.csdn.net/u012778714/article/details/81041323 这里首先从公用目录common里的文件说起:assert主要提供了两个宏:#define RELEASE_ASSERT(X, DETAILS)#define PANIC(X...
2018-07-20 18:11:03
4140
翻译 Envoy 源码结构
Envoy 源码结构译自 https://github.com/envoyproxy/envoy/blob/master/REPO_LAYOUT.md:api/ Envoy 数据平面(data plane) API bazel/ Envoy 使用Bazel构建时的配置 ci/   用于构建CI和Docker容器的脚本 configs/  &nb...
2018-07-14 11:01:30
3485
原创 errno 对照表
errno 对照表摘自Linux 4.17.3#define EPERM 1 /* Operation not permitted */#define ENOENT 2 /* No such file or directory */#define ESRCH 3 /* No such process */#define EINTR ...
2018-07-05 10:42:45
7307
转载 GetLastError的返回值的含义
GetLastError的返回值的含义: (0)-操作成功完成。 (1)-功能错误。 (2)- 系统找不到指定的文件。 (3)-系统找不到指定的路径。 (4)-系统无法打开文件。 (5)-拒绝访问。 (6)-句柄无 效。 (7)-存储控制块被损坏。 (8)-存储空间不足,无法处理此命令。 (9)-存储控制块地址无效。 (10)-环境错 误。 (11)-试图加载格式错误的程序...
2018-07-03 19:32:43
600
原创 C++时间管理
在编写程序的时候我们经常需要获取系统当前的时间,在之后我们免不了与系统API打交道。C++11添加了一个时间管理模块,从而使我们能够从语言层面获取到系统时间(C++11引入的东西确实方便了很多)。这里我们对其进行简单的封装,能够有效的获取系统当前的时间:#ifndef HEADER_CTIME#define HEADER_CTIME#include <mutex>cl...
2018-06-03 16:36:51
925
原创 日志模型
上一篇中我们将C++11的线程做了简单的封装,再加上消息队列组成了一个带有消息循环的线程模型。这篇中我们通过继承上一篇说的类,来实现一个服务器程序常用的组件,日志模块。不论是服务器程序还是客户端程序,详细的日志输出都是定位问题的有利工具,一个好的日志模块对服务器程序来说尤为重要,我们需要在书写日志的时候保证不影响或者最小的影响服务器的性能。这里我通过建立一个新的线程来书写日志,用内存池来管理投递消...
2018-06-03 16:22:52
869
原创 C++线程模型 one-loop-per-thread
C++11引入了线程对象,使我们能够在语言层面方便的执行线程操作,能够将成员函数,函数对象,lambda函数都当作线程入口,从而不用再去在不同平台上对系统API去做一些生硬的兼容措施(比如将类指针当作线程参数传入到线程函数中从而能够访问类成员)。在这里,我对C++11的线程对象进行简单的封装,实现的简单的线程操作,接着辅助于上一篇提到的消息队列,实现了支持消息转发的线程模型。首先看下简单线程模型的...
2018-06-03 15:38:02
7708
原创 C++消息队列
在编写多线程程序的时候常用到一种模型叫做 one-loop-per-thread,就是每个线程一个循环来处理逻辑,这就需要一个消息队列来支持线程间消息的投递。封装好的线程模型只需要在消息进出和访问公共数据的时候进行加锁保护,其他情况下不需要加锁,从而最大程度的较少锁的碰撞,这也是one-loop-per-thread的优点之一。 这里我通过C++11的互斥量和条件变量实现了一个消息队列。先把源码...
2018-06-03 14:54:16
5893
原创 C++智能指针实现
上一篇介绍内存池的文章中提到一个基于内存池的智能指针。C++没有GC机制,需要程序员自己管理内存,而智能指针则是C++程序员管理内存的利器。智能指针的原理早已广为人知,通俗来讲就是用类来表示指针(用类来表示对象是OPP思想的核心),成员函数里构建一个指向对象的指针,在构造函数,赋值函数,复制构造函数,析构函数等会改变对象个数的地方增加或减少引用计数,当引用计数为0时,释放指针指向的内存,从而避免了...
2018-06-03 11:48:19
1111
原创 CEF完整嵌入DUI窗体(六) (补:页面调用摄像头)终
CEF完整嵌入DUI窗体(六)这个系列的终章终于姗姗来迟,这一年多以来还是变化了很多,我也从客户端开发转到了服务器开发。现在再回头来看这些代码,不免有疏忽之处。而且之前一直没有整理开源的代码,只是上传的一份单进程的Cef控件实现。今天终于整理了之前的代码,重新上传到Github上,其中或许还有不少问题,大家发现可以与我沟通。 QQ : 272653256 GitHub :https://g...
2018-05-13 19:32:01
2338
1
原创 CEF完整嵌入DUI窗体(一) --Cef3简介
公司的客户端最近从IE的浏览器插件切换到了Cef自定义控件,前后也经历了挺长时间。完成后前端和测试一阵欢呼,终于告别了IE的兼容性问题;网上虽然关于CEF的资料浩如烟海,但不是太老就是不全,很难找到一个完整的教程;所以在这里打算将Cef封装应用的过程完整的记录一下,一是自己总结经验,二是和同行沟通共勉。 这里先对Cef做一个简单的介绍: CEF全称Chromi...
2017-07-03 11:37:23
6182
3
原创 解决360等杀毒软件阻止文件替换的问题!
测试反馈说程序升级的时候主进程的exe总替换不掉,起初以为是升级的时候没有进程没有退出,于是在很多地方添加了检测杀死进程的代码,结果问题依旧,后来才发现是该死的360阻止了exe文件的覆盖,奇葩的是报出替换会引起系统问题。还有一个费解的问题是360好像很有针对性,修改,删除这个exe都不会报错,但是替换就会阻止;闲话少叙。说下发现:开始的时候用的API是MoveFile(LPCTS
2017-03-21 13:33:21
2624
原创 Windows上C++连接MySql的问题
1,配置MySql数据库, 配置环境变量,在path中加入bin的路径 cmd中,cd到mysql的bin中,执行命令 mysqld -install net start mysql 启动服务 mysql -u root -p 进入mysql SET PASSWO
2015-08-28 11:26:54
393
原创 如何用MFC创建透明画板
如何用MFC创建透明的背景,不透明的绘画1,设置窗体为全屏幕显示//获取屏幕的长和宽int iWidth = ::GetSystemMetrics(SM_CXSCREEN);int iHeight = ::GetSystemMetrics(SM_CYSCREEN);//设置窗体位置和大小SetWindowPos(NULL, 0, 0, iWidth, iHeight,SWP
2015-08-18 16:16:07
766
原创 string与unsigned char*的相互转化
1,string到unsigned char* 先将string转化为unsigned char * 2,unsigned char*转化为string 先将unsigned char*转化为char *
2015-06-18 15:02:23
29350
4
转载 mysql api的函数声明简介
第一部分 控制类函数mysql_init()初始化MySQL对象mysql_options()设置连接选项mysql_real_connect()连接到MySQL数据库mysql_real_escape_string()将查询串合法化mysql_query()发出一个以空字符结束的查询串mysql_real_query()发出一个查询串mys
2015-05-06 14:23:56
454
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人