- 博客(19)
- 收藏
- 关注
原创 详解C语言开发unix/Linux下安全套接字(SSL)的TCP服务端程序
本文详细说明了用C语言开发UNIX/Linux下安全套接字(TCP SSL)的服务端程序,采用IO多路复用,单进程单线程,自定义并实现缓存,链表等数据结构,代码由本人亲自编写,在IBM AIX,Solaris,Linux多个版本下都能够稳定运行,下面详解程序: #define USE_SSL_CERTF "server.crt" //服务器证书文件名 #define USE_SSL_KEYF "server.key" //密钥文件文件名 #define USE_SSL_CACERT
2011-02-25 20:51:00 4352
原创 2021-05-14
根据从业多年的经验,使用C/C++开发的应用程序发生了运行崩溃,其主要原因有几点:指针操作不当1.1 指针未初始化一个指针在Debug下编译器自动将其初 始化为NULL,一块缓存同样在Debug下编译器会自动将该块缓存中的所有字节初始化为0然而Release下则不会发生这样的事情,需要程序中有初始化的代码。1.1.2 指针越界读写这个错误几乎所有的开发人员都会犯,有个好办法可以避免:用模板类封装指针,重载+=和-=操作符,在里面判断是否越界。1.1.3 指针用完释放后未置NULL一个良好
2021-05-14 07:31:36 148
原创 我的RPC
RPC框架之进阶:RPC的核心功能就是支持远程函数调用,就如同在一个进程内调用各种函数一样,这也是最基本费功能,但我的RPC框架绝不仅仅只支持最基本的功能,还要支持高级的功能:1.异步RPC函数调用传统的函数调用都是同步模式,调用者要等到被调用函数结束了才能返回,这显然太单调了,我就想发起函数调用后去睡一觉,等我醒来查看一下调用结果,这种异步模式充分节约调用者的时间,让调用者睡觉和工...
2020-01-13 13:42:28 160
原创 防拷贝防盗版之函数地址重定向
最近做软件程序license控制想起了八年多以前给同事一个英国的华裔朋友做的windows下的软件破解,那个程序很容易破解,它通过读取硬盘序列号生成注册字符串,前期我是挂接特定的win32 API,修改返回的硬盘序列号,后期觉得很不自然,通过修改程序入口地址注入了破解dll,不修改任何数据,而是在生成注册字符串的地方弹出一个msgbox,将其显示出来,为此我的到了约400英镑的酬劳。现在来看这种...
2020-01-13 13:38:37 305
原创 码农是怎样练成的
python,java等类脚本语言都是C语言开发出来的,后代比祖先优越在哲学上是天经地义的,但从与操作系统,硬件等底层核心的距离来看后代根本就触及不到,因此就丧失了最基本的生存技能。就如同祖先是经过与各种野兽,各种天灾斗争了很久很久后创造了一个让后代基本上可以安枕无忧的平台和环境,能说后代就继承了祖先的各种斗争技能么?显然不能。因此这些后代语言的使用者们虽然能够享受到优越性,但也仅此而已,因为这些...
2020-01-13 13:37:18 208
原创 AI 大数据统计仿真
今天说说AI:确切地说称呼为"大数据统计仿真"更准确,一切都以统计学为核心。举个例子:百分之90的人早上起来洗脸刷牙吃饭然后上班,用AI对此的模拟则是使用成千上万的人的早上起床后的行为来训练AI的核心统计模型(神经网络),然后把早上的时间和人的年龄,性别等作为输入,行为(就是做什么)作为输出,这样一个早晨管家AI机器人就诞生了,原理其实很简单。再来一个例子:所谓智能呼叫中心,用户打电话进来说了句...
2020-01-13 13:35:50 1343
原创 spring cloud 微服务之殇
spring cloud 微服务的确是好东西,能做很多很多事情,但微服务以进程的方式存在,多个微服务之间通过RPC互相调用则是牺牲了性能为代价,因此实时系统绝对不能够使用这种多进程,进程间通讯的微服务方式(频繁的网络IO就会消耗大量的CPU时间片,更不用说进程间通讯的RPC参数的列集和散集了)。而且微服务进程无法共享数据库连接池,如果每个微服务都配置该微服务进程使用的数据库连接池的话则数据库的压...
2020-01-13 13:34:47 195
原创 简单的并行搜索计算
假设只有一台PC,linux32位操作系统,内存4G,4核CPU,需要在一8G大小的无序文本文件中搜索指定字符串(譬如:“I LOVE YOU”)的存储位置(距离文件头部的偏移量)和总数。要求:最短的时间最高效的技术实现方式。这类问题可以归结为并行搜索计算的范畴,要实现并发就必须要让每一个cpu都参与搜索计算,而且搜索和计算的过程不能有互斥锁,信号量等同步操作,否则并发就会在某种情况下变成了串...
2020-01-13 13:33:27 700
原创 地图搜索高速一法
如何在地图上搜索?譬如:搜索A地到B地有几条道路或者有几个如家酒店或肯德基店。首先建模的时候图层是必须的,道路在道路图层,酒店在酒店图层,肯德基在餐饮店图层等,这样在对应的图层中搜索速度和效率就会好很多,但这里有个问题:图层中的图元与经纬度要建立关系,这样搜索的时候两个经纬度圈定位置范围,所有图层中图元的经纬度落在此位置范围内的就都能搜索出来了,然而这种搜索在数据库层面上无法避免全量搜索(不管是...
2020-01-13 13:31:20 467
原创 哈希表杂谈
哈希表,对于很多开发人员来说简直亲切的不要不要的,但哈希表在严重的哈希冲突的时候其查询的时间复杂度就会严重退化(JDK1.8之前是拉链法 时间复杂度O(N),之后是红黑树 时间复杂度O(logn)),对于具有实时性要求的系统来说绝对是个大隐患,那么如何解决呢?如果软件系统自主管理关键字(key)的生成和分发,则有一个很好的解决方案:任何查询算法都不如直接寻址,我们用1024作为横轴,用1024的...
2020-01-13 13:29:50 118
原创 巧用postgresql数组类型的列处理上下级多级审批类型的业务
巧用postgresql数组类型的列处理上下级多级审批类型的业务:在一些不支持数组类型的数据库中处理上下级审批类型的业务不得不创建新的表来存储当前审批者的标识信息,如果这种类似逐级审批的业务类型比较多则需要为每种业务类型创建功能相似的表,增加了系统业务关系的复杂性。有了数组类型的支持则完全不同:当前审批者的ID(必须支持多个直接上级)保存在数组类型的列中,每一个直接上级审批通过后将自己的所有直...
2020-01-13 13:28:59 205
原创 TCP之TIME_WAIT
TCP的TIME_WAIT状态是为了防止迷路的FIN/ACK包出现后破坏已有的连接的防护机制,但等待的时间也太长了(应该是ip包在网络上的最大生存时间决定的),如果通过设置套接字的DONTLINNER选型或者修改系统内核参数使之变小,虽然可以暂时解决问题,但毕竟隐患始终存在,会造成不确定的情况下的服务器不稳定。我个人认为有可能是TCP协议中的早期设计问题(个人观点):对于一个成功创建的TCP连接...
2020-01-13 13:28:03 220
原创 C++智能指针之殇
指针-作为C/C++的标志性门槛理解起来确实是有难度的,而且指针也不容易管理,特别是动态申请的内存,一不小心就可能忘记释放,导致系统资源消耗越来越大(内存泄露),直至崩溃!为此C++新标准中出现了智能指针,用智能指针封装真正的指针,本质上就是通过内部的引用计数来控制指针的释放:作用域增加则内部引用计数++,作用域结束则内部引用计数–,当引用计数==0时才真正释放该指针指向的内存。确实是很好的东西...
2020-01-13 13:27:06 240
原创 变长内存池的设计概要
变长内存池,听起来感觉很是高大上,其实也是很简单的一种定长内存池的多维度管理。我设计开发的变长内存池就是完全基于这种思想:1.首先定义最小分配长度=32,为了兼容ARM CPU,一定要确保分配的内存地址是4的整数倍。2.以32的倍数作为长度维度,意思是说当前申请的内存长度可以通过计算定位到合适的长度维度 ,例如:一次申请78个字节长度,则78/32=2(倍数),78%32=14(余数),定位...
2020-01-13 13:26:04 289
原创 JAVA的性能优化简述
谈谈java的性能优化技术:java以垃圾回收著称,意思是new出来的对象,JVM负责回收,使得开发者无需管理内存问题(实际上也没法管理)。一个程序可以长期稳定健康的运行首要条件就是内存的使用始终在一个平稳的态势上,很难想象进程在运行中其内存的使用如过山车一般忽高忽低,如此不崩溃都对不起开发者。JVM的垃圾回收其实就是过山车的导演,在内存不够用的时候来一次full gc,此时整个进程的内存使用...
2020-01-13 13:23:35 235
原创 如何设计高频交易系统
假设我们要设计一个高频交易系统,TPS等于1(每秒一次交易事务),后台关系数据库该如何设计以满足高性能的新增,修改和查询等功能?我的设计方案:拆分交易主表,分流交易量。每小时一个(为确保交易事务的存储完整性,允许溢出一个完整的交易事务的时间),一天24个,要创建一周的,共计724张表。通过这样的方式,我们可以看到,每张表每个月最多存储3600(4或5)个交易,每年最多存储3600*(4或5)1...
2020-01-13 13:19:39 1295
原创 更新了已经过测试-Windows下如何改写目标进程的窗口函数来注入DLL
Windows的UI线程简单地说就是创建了窗口的线程,其创建的窗口都有窗口函数,在这里,我介绍一个改写UI线程窗口过程来注入DLL的方法:一:获取一个进程的窗口句柄,例如Notepad.exe进程的主窗口类名是 “NOTEPAD” 通过 FindWindow("NOTEPAD",NULL) 就可以得到运行的 Notepad.exe 的 主窗口的句柄设为 hWndNotepad, 通过 GetWindowThreadProcessId() 就可以获取到 创建该窗口的线程I
2011-02-21 20:37:00 3638 13
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人