C/C++
文章平均质量分 60
lld951027
这个作者很懒,什么都没留下…
展开
-
linux 高版本gcc兼容低版本系统的方法
3、使用musl-gcc的静态编译二进制,这个只要代码能编译出来,就基本能拿到各个系统下去运行,但源码中应该不能包含系统调用,缺少 之类的内核相关的头文件,猜测需要把buildroot放在一起编译才行。我们不能在低版本的系统上去运行只有高版本实现的功能,只能运行两者有相同签名实现且结果是相同的,才能做版本替换,否则是需要自行去实现功能的,无论是静态还是这些方法,都不能去绕开这个最基本的问题。以下是两种方案是合理、可行的。原创 2023-07-11 14:55:12 · 2999 阅读 · 0 评论 -
linux c++ 双向交互管道及冲突解决
那么如果目标进程是交互式的,显然不能满足要求,那么就需要再往底层走一点,自己创建双向管道,去做交互。通过ida反汇编调试,发现这地方会去fdopen(0,"a"),如果在外部重定向管道,这地方就没法过去。这引出一个非常棘手的问题,仔细阅读dup2的说明可以发现,dup2在以指定的文件描述符进行重定向后,会关闭原本的文件描述符。换个思路,那么如果我去fdopen一个指定fd,就可以通过这句,首先修改目标进程变量dword_8082A28的值,确保在此处为7。原创 2022-10-31 16:44:12 · 552 阅读 · 1 评论 -
文件真实类型识别 - linux c file
在windows下,文件类型一般以后缀名的形式体现,但后缀名却是可以随意更改的。甚至在linux下,本身是没有后缀名的概念的。在很多应用中,需要判断文件的真实类型,例如web上传文件等在网上有很多都是简单识别下文件特征,例如jpg、png、mp4这些常见的格式,那么有没有很全面的文件类型识别的方法呢?当然是有的当时调研了很多库,发现linux下开源的file所覆盖的范围当属第一,纯c代码,通过阅读源码可以知道,既可以通过magic文件拓展识别特征,还能对文本判断编码、是CR、LF还是CRLF之类的,可谓是面原创 2022-06-28 10:18:54 · 810 阅读 · 0 评论 -
关于Visual Studio 不支持x64 内联汇编分析
记录一下今天的大坑,实在是有必要记录一下调程序发现参数在函数传递时,出现了异常的值,已经确认不是指针破坏的问题。用汇编看了下,发现汇编寄存器地址都取错了,在release开启o2优化时出现,关掉又正常,实在是百思不得其解。对于内联汇编,其实很多人简单的就能想到__asm这样嵌入进去的代码。但后来我仔细找了下,发现内含的函数,与__asm 所体现的形式完全一致。通过#pragma intrinsic(myfunc) 所定义,具体可以参考#pragma的详细用法_寂寂寂寂寂蝶丶的博客-CSDN博客#pragma原创 2022-06-09 16:27:05 · 1395 阅读 · 0 评论 -
全志F1C100S RT-Thread(RTOS)视频教程
作为搞软件开发的,弄这种硬件底层的东西还是挺头疼的,因为我搞的东西要求实时性非常高,又要低成本(要让不吃草的马儿跑),FPGA虽然能满足需求,但实在是贵,开发成本就更高,成本控制上就被K掉。arduino那些简单便宜,性能却又完全达不到要求后来找到个做硬件的朋友,推荐了这个全志F1C100S,据说芯片就10多块钱,我tb上买的成品板,也就40多,批发或者量产的话,成本肯定还能更低。这个芯片居然能跑400-900 mhz,32m ram,温度还低,然后板载了个nor flash,实在是非常非常可怕,基本满足了原创 2020-01-15 11:21:19 · 9658 阅读 · 12 评论 -
linux c++ epoll 网络框架
ps该框架不适用于B/S,个人认为.netcore/nginx这些已经做得比较完美了,整个框架以及以后的规划都会只针对于C/S端使用。服务端返回此处通信的PUB_KEY,客户端生成AES秘钥,使用此处的PUB_KEY将密钥通过ECC加密后发送至服务端。5.基于应用层头协议,支持单通道消息穿插,无需切片,毫秒级响应(例如单通道传输文件时收发文字消息的场景)3.良好的负载均衡设计,使得多用户之间的资源占用更为公平,减少长时间无响应的发生概率。减少由多通道而带来的额外开销,使用管理更加简单、轻便。......原创 2019-12-19 10:39:05 · 460 阅读 · 0 评论 -
C++ SOCKET通信模型(四)IOCP
相比IOEvent,IOCP没有事件监听,而是采用线程池管理(其实就是对用户创建的线程的一个分配管理机制,本身并不会创建多余额外的线程)+队列的形式,没有监听事件数量的限制,没有事件列表为空需要等待的问题,虽然IOEvent没有IOApc里负载均衡问题严重,但还是存在一定负载均衡问题,并且需要自己去做均衡策略,在IOCP里得到完美解决。相比IOApc,上篇所提到的IOApc的5个问题都得到解决。并原创 2017-08-29 17:23:21 · 1281 阅读 · 0 评论 -
C++ SOCKET通信模型(六)同步epoll
从上篇可以看到,由于每次poll都需要pollfd的数组地址,所以整个设计里面还包含与Client*的对应关系,移除的时候还需要去维护,让人感到十分的不便,就和IOEvent,select一样的感觉。每次还需要把整个集合分配给线程是遍历,虽说比select好,但仍有不足。EPoll就真的很刁了,不会随连接数的增多而有额外的性能损耗,每次分配给线程的是此次需要处理的event,使用起来也非常简单,不原创 2017-09-01 21:50:53 · 532 阅读 · 0 评论 -
C++ 高精算法
高精算法这东西听起来还是有点高大上,说白了就是模拟小学学的竖式加减乘除,原理非常的简单,用一个int数组存储一个数,int数组中每一个表示这个数的每一位,数组中的顺序是从低位到高位存储,这样在运算的时候进退位很方便,并且用数组中第一个记录这个数的长度,这样就避免判断高位0是否是有效0。还有就是处理运算后进退位造成的位数长度变化,这个需要点技巧,我是最开始让结果位长度等于原位长度,然后在进位到最高位原创 2017-10-04 20:38:19 · 2951 阅读 · 0 评论 -
VC++ 拖拽和Hover效果
效果就是gif所展示的,我做这个是想模仿游戏里面拖动物品到方格上部署的这么一个效果,用纯windowsapi实现起来还真的有那么一丢丢困难。主要涉及以下这几个点:1、双缓冲绘图:缓冲绘图十分重要,可以屏蔽掉InvalidateRect清除背景,如果直接先清除再重画,那么一定会看到屏闪。所以一般不对hdc进行直接操作,所有操作都是对内存DC操作,比如移动,我先让原位置的物体用背景替代,然而在原创 2017-10-22 13:18:28 · 667 阅读 · 0 评论 -
C++ RSA
首先要说证明不全是我自己证明的,有些是从各个地方整理出来的,证明包含了每个细节,可以说是最详细的一套从头到脚的证明,有助于对RSA算法的绝对理解,主要是关于a,b互质的不定方程用辗转相除求解,其中还有一些相关的定理证明,还有欧拉定理用于RSA公式的证明。代码是自己写的非高精RSA实现,高精看着太难受了,写着也难受,就暂时先放掉,也就是说任何一个地方都不能超过long long 的取值范围原创 2017-10-25 11:22:45 · 951 阅读 · 0 评论 -
C++ SOCKET通信模型(三)IOApc
说IOCP之前,不得不说下基于Overlapped IO模型的另外一种设计思路,上篇说的是基于事件通知的,这篇就说下完成例程,也可以说是回调。基于事件通知,始终有每个线程最多只能监听64个事件的限制,就算经过我上篇写的多线程优化,但线程数始终是有限的,我8G 内存 大概就1500多个线程左右,那么 1500*64=9W6,看上去感觉也足够了,但过多的上下文切换不说,离单机可连接的socket最大值原创 2017-08-28 11:55:52 · 495 阅读 · 0 评论 -
C++ SOCKET通信模型(二)IOEvent
本系列我准备做一个完整的研究,包含Windows的IOCP IOEvent,linux的poll 和 epoll,上篇已经说了非阻塞IO衍化的select多路复用IO,由于windows和linux都差不多,就不再多说select模型了。那么还是先从windows开始吧,这篇主要看下IOEvent。虽然windows作为服务器没有linux那么强,但还是不得不佩服微软的设计思路,这种模型看起来没有原创 2017-08-26 16:06:23 · 1350 阅读 · 0 评论 -
C++ SOCKET通信模型(一)select
以前做游戏服务器的时候我就听说过IOCP和EPOLL,一直没来得及去填这个坑,从今天开始有多余的时间打算把这个重要的坑填上。说IOCP和EPOLL前,先说说阻塞+多线程模式,我以前都是写竞技类的游戏服务器,所以TCP基本上都是长连接,其实感觉也还可以,只要同时在线不是太多不会有什么问题。但如果是短连接高并发的话,那问题可就严重了,如果没有线程池的话,光创建销毁线程的开销可不小,而且相当的费内存,响原创 2017-08-24 14:15:20 · 2616 阅读 · 7 评论 -
C++ 多进程DP
题目描述设有N*N的方格图(N人数字0。如下图所示(见样例):A 0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 0 0 0 0 0 7 0 0 0 0 0 0 14 0 0 0 0 0 21 0 0 0 4 0 0 0 0 15 0 0 0 0 0 0 14 0 0原创 2017-09-26 19:24:47 · 563 阅读 · 0 评论 -
VS2017 中文乱码
最近由2015换到了2017,开发.NET CORE 今天在测试C++的东西的时候遇到中文乱码,不用想都知道编码问题。控制台默认编码肯定GBK,可能2017默认保存文件编码是UTF8吧。。。一看,果不其然要改编码很简单,高级保存设置 选为自己想要的编码即可。但VS文件菜单中默认没有高级保存设置,需要在工具-》原创 2017-08-23 11:11:23 · 14937 阅读 · 2 评论 -
C++ SOCKET通信模型(五)poll
在windows上绕了一大圈之后终于又回到linux,主要就说下poll和epoll。从这两个模型上可以看出,linux始终都没有采取将内核的收到数据直接拷贝到用户缓冲区,epoll用了更加灵活的办法:mmap,这么做可能是为了让开发人员去处理传输过程中的问题,比如像传输缓慢之类的处理策略。poll和select用起来非常相似,但select每次循环都要清空重设内核对象,poll通过标识的办法避免原创 2017-08-31 18:02:20 · 2283 阅读 · 0 评论 -
C++ mmap/munmap
很早以前就看过文件操作的另外一种方式:内存映射,后来一直忘了去补这个坑,今天有空试了试,感觉非常好,强大之处远远超出了想象。这个映射让文件操作像直接操作内存一样,变得非常简单,而且对于以前感觉很难解决的文件操作上变得是异常简单,比如多进程间的操作文件,文件锁,缓存文件之类的东西,做起来思路会更清晰很多。mmap的作用域应该很广吧,我猜测虚拟内存之类的东西,mmap是必不可少的吧。为啥子说这个东西很原创 2017-08-22 16:21:47 · 4391 阅读 · 0 评论 -
C++ MD5
MD5是一种摘要算法,通过压缩+加密+hash的算法是绝对不可逆的。网上有很多人都写了,我也参考了MD5的基本规则写的。这个算法从数学角度上来说,主要是需要证明唯一性,但凭我等的能力想要做这种证明是不太现实的。因为我实在没办法去证明通过一系列的运算,累加a,b,c,d还能够有唯一性,因为就逆向去看加法,那是有无数解的,MD5也只能说在概率上是不会重复的吧。所以说那个幻数,还有里面的那些数据,是不能原创 2017-11-11 20:55:39 · 3684 阅读 · 3 评论 -
C++ Tea
Tea算法属于分组加密、对称加密的一种,对于对称加密算法,解密过程就是一种对加密过程的逆运算,根本不需要什么数学证明。简单来说就是我有两个数 a,b ,a+=k1b,b+=k2a,a+=k3b,b+=k4a.....a+=knb,b+=kna,最后存储的就是最后的a,b的值,那么我可以用a去还原b,还原后的b又可以去还原上一个a,以此类推,对称加密和把两根绳子螺旋捆在一起,然后反向旋转分开的过程。...原创 2017-11-12 12:12:34 · 1105 阅读 · 0 评论 -
C++ ORM Matador
对于关系型数据库,sql无疑是让人头疼的地方,个人对写这种重复CRUD的代码简直觉得是恶心透底,要是表再一多,瞬间爆炸。对于c++,我以往本身还是很排斥ORM的,毕竟那是java和c#喜欢用的东西,感觉没有什么比较顺眼的开源框架,直到这次在巨大压力下尝试matador这个框架,其本身简洁的语法以及极低依赖深深吸引了我,没想到在c++里orm也可以实现得如此优雅。支持采用db first 和 c...原创 2019-02-20 18:26:06 · 1764 阅读 · 2 评论 -
C++ CMake常用总结
这次在公司强制熟悉了一波CMake,以前自己就算是宁肯写makefile也不想去引入cmake,总觉得越原始的东西可控性越高,强迫症晚期了,哈哈。没想到用了之后才觉得,这东西还真**方便,不用真SB了。Cmake在解决跨平台编译配置问题基本是首选(虽然还没试过),仅仅是看了别人写的CMakeList.txt就这样觉得,几句就可以生成不同编译器,不同操作系统,X86和X64的编译配置文件。解决头文件...原创 2019-02-23 23:07:08 · 514 阅读 · 0 评论 -
c++ 乘积最大
今天抽空活动脑子做题,虽然一次过了,一看耗时是别人10倍,内存消耗也高。。最后发现居然自己傻逼了,把DP的题用DFS解了。。。不得不说方法和思路是至关重要的。。。 这个题有个很关键的地方,这个性质决定了这题应该是用DP求解。就是 X被划分成X1 X2 ,X1*X2<X,根据此性质,可以知道第0次划分值是最大的,第1次划分最大值依次缩小。才能对最大值依次往下进行划分 我这都把代...原创 2018-12-06 13:14:28 · 2431 阅读 · 0 评论 -
c++ 局域网远程开机(wol、魔术包)
实现原理很简单,就是udp发个包,共102字节。网卡应该是基于链路层处理的,并不用指定特定的IP和端口,随意设置端口全网广播即可。最后再加个bat脚本 ./WOL.exe xx:xx:xx:xx:xx:xx,放在365*24小时开机的mini小主机上,远程登录小主机,点下bat就可以将大PC开机(PS:主要是因为我大主机太耗电了,开24小时有点受不了),进行控制了~但在win10下遇到个特别蛋...原创 2018-11-24 15:33:50 · 11576 阅读 · 0 评论 -
c++ 旅行家的预算
空闲时间仍然做些题活动下脑筋,偶遇这题,感觉挺有意思的,难度不大,但真的实实在在的体现了贪心算法的核心价值观hhhh.......总的来说,就是在当下不断循环去寻找最近的最好的解,有好的解,就直接跳过去,没有的话就认为当下是最好的,然后往下走一步算一步~ 题目链接 #include<iostream>#include<cmath>#include<...原创 2018-11-15 14:15:58 · 1510 阅读 · 0 评论 -
C++ 拼数
看到个挺有意思的题,虽然使用stl非常简单,但要完全不使用stl的话,还是有点头疼的,关键在于如何在不拼接的情况下,计算出最终要的结果,我是从这个点出发的,因为我认为一旦一个一个去拼接比较,浪费空间、浪费时间,还显得很low。算法关键点在于A和B比较,A与B长度不一致的情况下,要以长的为基准,短的里面取模。可以这样比较的原因,在于是短的在前,长的在后,而前面通过比较已知A、B的相同部分,这个思...原创 2018-10-24 13:57:18 · 1520 阅读 · 0 评论 -
c++ qqcbc+tea qq数据包加密解密
qq.h#define uchar unsigned charclass qq{ const int delta = 0x9E3779B9;//黄金数 int c;//轮数 uchar* buf; void EncryptProc(); void DecryptProc();public: uchar* enData=0; uchar*...原创 2018-10-09 16:27:00 · 1735 阅读 · 0 评论 -
C++ SOCKET通信模型(七)异步epoll
这篇文章写得有问题,libaio+epoll的使用并没有这么简单,可以说要完善处理的话是非常非常的麻烦,并且有些地方要处理得很巧妙才行。由于相关内容涉及我写的毕业论文,所以暂不公开,希望理解不得不说为这异步epoll模型还真是伤了神。。。主要问题就是在libaio的内核通知上,因为这东西实在太低级了,用起来还比较麻烦。我为了不再多开线程,实现和IOCP基本相同的原理,在PROC内部又用了次epol...原创 2017-09-05 10:32:38 · 1761 阅读 · 0 评论 -
C++ 归并排序,千万级以上数据的排序
众所周知,著名的8大排序算法相信大家都看过,但我唯独对归并排序是情有独钟。因为这个算法,是一个可以轻松而愉快的进行并行排序的东西,而且归并排序是稳定的。当数量达到一定级别的时候,无论再优秀的算法,都会消耗一定的时间。所以,这个时候,就必须利用多线程去加速计算,但多线程又是一个极其难以控制的东西,因为必须将主体分为绝对互不影响的N部分就分别计算后统一,恰恰归并排序就有这个性质,并且还是均分的。归并的原创 2017-12-11 18:08:36 · 4126 阅读 · 1 评论 -
C/C++ 文件操作总结
C文件操作相关函数:FILE * fopen(const char * path,const char * mode);r 打开只读文件,r+打开可读写文件(可覆盖),该文件必须存在w 打开只写文件,w+打开可读写文件(绝对覆盖清空,相当于新文件),若文件不存在则建立该文件a 打开只写文件,末尾追加,若文件不存在则建立该文件,a+ 打开可读写文件,末尾追加,若文件不存在则建立该文件,...原创 2017-04-26 22:40:58 · 460 阅读 · 0 评论 -
C++ P2P通信
P2P通信是几年前我就看过的东西,但那时候主要用TCP,还有NAT的类型会对其有限制,所以觉得并不太通用,而且,打造这种环境也实在太麻烦,也就没有去写代码实现下。其实我心里一直觉得P2P是个很神奇有用的东西,现在补坑,还是去把P2P给重新弄了一遍。理清思路之后,发现P2P其实并不像以前想象的那么复杂首先,NAT有几种分类,这个是必须需要知道的。我是用联通4G 和 校园网宽带作为andr原创 2017-11-13 21:25:05 · 4223 阅读 · 2 评论 -
C++ B树
写了红黑树之后再写B树,可谓是轻松了不少,毕竟B树的分类情况比红黑树少太多。当然从效率上来说,我这个版本的B树实现效率肯定不是最高的,我是先删除移动后再做平衡,其实可以通过标识的方法在平衡里覆盖掉需要删除的点即可。当然写的时候为了思路更清晰,我并没有这样去写。还有个原因主要是,B树真的就是一种思路,就是通过这种结构算法,建立文件系统,从而大量数据搜索的时候,可以接近二分搜索的时间复杂度,优点就在于原创 2017-08-21 17:12:35 · 886 阅读 · 0 评论 -
C++ 23树
23树这篇文章写得有点问题,择日修改更新: 参考后面写的B树 实现 http://blog.csdn.net/nightwizard2030/article/details/77451712#include #include #include #include#includeusing namespace std; int new_counter原创 2017-07-05 11:55:59 · 2643 阅读 · 0 评论 -
C++ 红黑树 (附带调试工具)
这红黑树写得可谓是一路艰辛,本来前天就以为写好了,结果高兴的时候发现写出了BUG,而且看代码,在DOS下实在找不出,害得我用MFC写了一个查看的工具,简直苦逼了,当时心里郁闷得要死先来说下代码,我插入 删除都用的是递归实现,说实话,感觉递归实现删除并不是特别好,因为在遇到出度大于1的节点时需要找到后继,再删除。那么真正删除的是后继节点,删除后平衡就需要从后继节点上开始。其实红黑树平衡与AVL不原创 2017-07-31 17:02:21 · 4044 阅读 · 7 评论 -
c++ socket 10022 listen监听失败 BUG!
最近写个游戏服务器,老板比较穷,小公司,linux下维护不了,让我在windows下写,遇到了个坑得一B的问题。在一次新增一些类的时候,发现,listen无论如何都返回-1,getlasterror返回10022,这个问题确实找了很久,而且可以肯定这是个BUG。当#include 在一个类里面时,并且在socket监听类中包含该类,则listen会返回-1,导致无法监听,具体原因还不得而知,今天原创 2016-12-15 01:57:47 · 5845 阅读 · 11 评论 -
Windows C++服务器 全局秒级高效计时处理器
c++11 支持lambda 回调支持无锁多线程操作,cancel 返回true时有一定概率无法取消func的执行.h文件#pragma once#include #include #include #include #include void Polling(void* ptr);struct _GTimer_Arg{ int time=-1; st原创 2017-03-22 10:55:50 · 365 阅读 · 0 评论 -
C++服务器 多线程锁
最近做服务器遇到个很头疼的多线程问题,本身说来是自己设计的时候出现了逻辑矛盾,room 本应在检查之前lock,在delete之后unlock,但后来发现 如果锁是在自己上是矛盾的,用roommanager中的锁又影响效率,最后发现应该由rm管理维护对应room的锁的数组原创 2017-03-25 23:40:14 · 780 阅读 · 0 评论 -
C++ 八皇后 递归算法实现
八皇后问题感觉是递归算法中比较简单的一种,核心思想就是放置之前检查行列四个斜方位即可,还是挺有趣的,和汉诺塔一样,应该属于递归比较经典的问题#includeusing namespace std;int g_count=0;bool CanPlace(int row,int col,int (*chess)[8]){ for(int i=0;i<8;i++){ if(ches原创 2017-04-05 13:14:12 · 7990 阅读 · 3 评论 -
C++ BF和KMP算法
搞开发已经搞了几年了,回过头去看算法,还是在KMP这个算法上死了不少脑细胞。这个KMP算法和LZW压缩算法的思想有异曲同工之处,就是用已有的东西去推理出尽可能多的结论,这种算法往往不是特别好理解,因为有推理就会有证明,还有特殊情况或者优化,在这种变化下就会感到非常难受KMP算法简而言之就是尽可能的减少BF中回溯的长度,从而减少不必要的执行,原理上来说就是A!=B,B!=C,=>A!=C原创 2017-04-07 14:06:13 · 822 阅读 · 0 评论 -
C++ 汉诺塔算法实现 stack模拟
汉诺塔,经典的LIFO递归问题,原理很简单,将N-1个移至Z,在将第N个移至 Y,最后将Z上移到Y上,但要求是只能移动顶,一次移动一个#include#include#include using namespace std;void Hanoi(int n,stack >& x,stack >& y,stack >& z){ if(n>0){ Hanoi(n-1,x,z原创 2017-04-07 22:14:02 · 529 阅读 · 0 评论