自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(86)
  • 资源 (16)

原创 CLOSE_WAIT问题排查

CLOSE_WAIT问题排查问题描述问题排查总结问题描述     服务端出现大量的处于CLOSE_WAIT状态的fd:问题排查     TCP协议的状态转移这里就不再重述,出现CLOSE_WATI的原因主要就是:客户端主动发起连接,服务端收到客户端的FIN时,但是服务端没有接着发送自己的FIN,此时,该连接对应的fd处于CLOSE_WAIT状态。也就是说当服务端调用read读取fd上的数据,返回为0

2020-09-03 23:17:34 24

原创 客户端偶现没有收到服务器响应问题的排查

客户端偶现没有收到服务器响应问题的排查问题描述问题排查总结问题描述客户端偶现收不到服务器端返回的响应包。问题排查当出现服务器端收不到客户端的请求包,或者客户端收不到服务器端的响应包时,第一反应就是是抓包,先确定是否存在丢包的可能。输入命令:tcpdump -i eth0 src port 9983 -XX抓取我们服务器9983端口发出去的包,结果如下:其中红色圈出来的部分就是应该返回的响应包,确定服务器端没有丢包。同样的,使用wireshark抓来自服务器端的包,结果如下:客户端也收到了服务

2020-08-13 20:23:31 139

原创 Mysql自动超时重连导致的中文乱码问题

Mysql自动超时重连导致的中文乱码问题     今天有客户反应从自选股服务器获取的自定义板块中文名称乱码,之前一直都是正常的。看到乱码两字,头脑中首先冒出来的就是查看mysql数据库中的编码集,输入SHOW VARIABLES LIKE ‘char%’;命令查看编码全部都是utf编码,没有问题。     再查看服务器日志:     服务器运行过程中

2020-06-04 19:22:05 118

原创 浅谈C++跨模块释放内存

浅谈C++跨模块释放内存一, MT改MD二, DLL提供释放接口三, 使用进程堆申请内存     在开发主程序和动态库时,首要原则就是:避免跨模块申请和释放内存。这一点,我们在很多开源库或者平常项目中也都碰到过,对于动态库中的堆内存申请与释放,动态库总是会提供两个接口分别实现new和delete操作,而不会让调用方自己去操作。但有时候如果违背了这个原则呢,在linux平台上不会存在这样的忧虑,因为在linux下,每个进程只有一个heap,在任何一个动态库模

2020-05-09 20:12:07 214

原创 套接字描述符的就绪条件

套接字描述符的就绪条件一,套接字可读二,套接字可写三,套接字异常四,代码演示     在使用select,poll,epoll等I/O复用模型时,我们一直在说当某个套接字描述符准备好读,或准备好写,或者在描述符上发生一个待处理的异常条件时,会触发相应的可读可写事件,下面对套接字描述的可读可写,以及异常条件做一个总结。一,套接字可读 ...

2019-12-03 21:50:44 877

原创 (栈帧和函数调用三)函数返回值的传递

(栈帧和函数调用三)函数返回值的传递一,函数返回值在5-8字节之间二,函数返回值超过8字节三,使用对象作为函数返回值四,总结     在本系列第一篇文章的总结中,我们提到过,从该例子的汇编代码中可以看到,函数的返回值是保存在eax寄存器中,在x86环境中,eax是一个32位的寄存器,只占有4个字节,对于函数返回值超过4个字节的情况又是如何传递的呢...

2019-11-13 22:07:25 948

原创 (TeamTalk服务端源码分析一)TeamTalk服务端部署

TeamTalk服务端部署在分析TeamTalk的各个服务器代码之前,我们先搭建一套服务端环境,结合之前的客户端,看一下一个IM聊天工具的基本功能。一、部署环境系统:centos7 X64位二,部署步骤1, 安装git gcc gcc-c++ mysql-devel unzip zipyum install -y git gcc gcc-c++ mysql-devel unzip zi...

2019-11-06 20:40:45 805

原创 (栈帧和函数调用二)_stdcall和_cdecl的区别

栈帧和函数调用(二)一,函数调用惯例二,_cdecl三,_stdcall四,总结     通过上文的介绍,我们大致知道了函数调用时实际发生了什么,以及为什么我们使用编译器调试代码时,可以通过栈回溯看到整个调用的流程。从这样的信息里能够发现一个现象,那就是函数的调用方和被调用方对函数如何调用有这统一的理解,例如,它们双方都一致认同函数参数是按照某个...

2019-11-01 11:20:03 772

原创 (栈帧和函数调用一)栈帧,函数调用与栈的关系

栈帧和函数调用(一)一,栈帧的介绍二,函数调用与栈的关系三,汇编演示     在计算机科学中,栈是一个特殊的容器,用户可以将数据压入栈中(入栈,push),也可以将已经压入栈中的数据弹出(出栈,pop),但栈容器必须准守一个规则:先入栈的数据后出栈(First In Last Out,FIFO)。    ...

2019-11-01 11:06:51 990

原创 VC6.0中std::string析构函数崩溃问题分析

VC6.0中std::string析构崩溃问题分析一,问题描述二,std::string源码分析(VC6.0)三,问题分析与解决一,问题描述     今天程序停止运行时出现了崩溃,分析dump文件查看堆栈如下:     可以看到程序是在std::string析构函数中进行free操作时崩溃的...

2019-09-26 19:25:12 1229

原创 (Windbg调试八)崩溃捕捉的dump没有提供堆栈的问题

崩溃捕捉的dump没有提供堆栈的问题前两天客户现场出现了崩溃,但是程序捕捉生成的dump文件大小为0kb,没有办法只能通过任务管理器创建转储文件进行分析,但是分析这个dump时,却看不到任何有效的对战信息。输入!analyze -v命令输出如下:通过此堆栈信息看不出任何崩溃的具体原因。再输入~*kv命令查看所有线程的堆栈:可以看到崩溃的线程,输入~56s切换到该线程,再输入kv查看该线程的堆...

2019-09-13 13:44:59 1328

原创 DLL释放引起的死锁问题

DLL释放引起的死锁问题一,问题介绍二,问题分析三,问题总结一,问题介绍最近在做代码重构,今早对前两天重构的某个组件进行自测时,突然发现停止程序运行时,出现了卡死,进程退不出,查看日志发现是FreeLibrary没有走完。打开任务管理器-》性能-》资源监视器,找到进程,右键分析分析等待链,结果如下:出现了死锁,16800线程是主线程(调用FreeLibrary),12128是DLL中的工作...

2019-09-03 20:04:17 812

原创 (Windbg调试七)c++内存泄漏问题定位

c++内存泄漏问题定位     内存泄漏指的是直接内存分配构造函数(例如new,malloc,HeapAlloc)来获得内存后,但是没有释放该片区域内存而导致的泄漏问题。我们的行情服务器是一个长期运行在客户服务器上的应用程序,如果存在内存泄漏,那么当内存增长到某个值时,会极大地影响当前机器的性能,直至影响我们的行情服务程序,甚至由于内存已不够而导...

2019-07-20 14:40:31 1275

原创 (Windbg调试六)c++句柄泄漏问题定位

c++句柄泄漏问题定位     在Windows内核中定义了一组操作系统特有的对象类型,包括文件对象,线程对象,Event对象等等。要使用某种对象类型,必须首先生成这种对象类型的一个实例,以事件对象为例,以CreateEvent可以创建或者打开一个有名的事件对象,在该函数内部,它调用了内核接口来创建一个事件对象,并且分配了相应的内存来容纳这个对象...

2019-07-17 20:02:23 1267

原创 DLL的导出函数

DLL的导出函数,__declspec(dllexport),.def模块定义文件,extern “C”区别一,__declspec(dllexport)二,.DEF模块定义文件三,__declspec(dllexport)和def文件的区别1,显式调用2,隐式调用四,结论      我们在编写动态库时,经常会用到类似extern “C”, __...

2019-07-11 19:54:29 5355 1

原创 (Windbg调试一)minidump崩溃捕捉

(Windbg调试四)dump崩溃捕捉一,系统的异常处理顺序二,SetUnhandleExceptionFilter函数三,Minidump四,代码演示平常我们编写c++代码时,发生崩溃,编译器都可以帮我们捕捉到并且定位到具体的代码,这是因为编译器接收到了操作系统发送过来的程序异常通知并进行了处理。但是在使用我们软件的用户环境上,没有编译器帮我们处理这个异常,操作系统会使用它的异常处理机制:弹出...

2019-07-03 20:12:49 1248 1

原创 (Windbg调试五)C++内存越界导致的std::map异常

C++内存越界导致的std::map异常     前段时间在定位一个程序崩溃的问题,虽然有dump文件,能够看到出问题的具体代码行数,问题都出在同一个map上。     dump1显示map下标插入数据时异常。     dump2显示调用ma...

2019-06-13 21:14:23 1721 4

原创 内存映射文件的应用

内存映射文件的应用一,操作系统加载EXE和DLL二,读写大文件三,进程间通信     内存映射文件是windows开发下常用的一种技术,既可以用来读写磁盘上的大文件,也可以用来实现进程间的通信,本文主要对内存映射的几大用途做一个简述。一,操作系统加载EXE和DLL     当一个应用程序启动时...

2019-06-08 11:31:35 1185 1

原创 RabbitMQ-死信队列DLX

RabbitMQ-死信队列DLX一,死信队列二,消息变成死信的几种情况三,死信队列的设置1,使用策略配置2,使用可选队列参数配置3,通过web管理界面设置死信队列四,死信队列的优点一,死信队列     利用DLX, 当消息在一个队列中变成死信(dead message)之后, 它能被重新publish到另一个Exchange, 这个Exchan...

2019-05-07 23:23:40 574 1

原创 C++进程间通信之SendMessage和PostMessage

C++多进程通信之SendMessage和PostMessage1,使用介绍2,需要注意的地方3,WM_COPYDATA的原理     SendMessage和PostMessage在Win32编程中是很常见的,主要是用来发送消息到指定的窗口,一般用于工作线程传输数据到UI线程。其中SendMessage函数将指定的消息发送到一个或多个窗口。此函...

2019-04-28 10:27:48 2613 1

原创 memcmp比较结构体

memcmp比较结构体例子1:例子2:在日常编码中,有时为了方便,当一个结构体内不含有指针成员时,我没会使用memcmp来对两个结构体进行比较,但是这种做法不是一个正确的方法,也可能会导致错误的比较结果,我们以下面的例子来进行验证。例子1:#include <iostream>struct Info{ char a; int b;};int main(){ I...

2019-03-14 22:37:46 2004

原创 Linux下C++访问Redis

Linux下C++访问Redis编译redis例子gcc编译编译redis开发包的下载和编译在其他文章中已经介绍,不熟悉的可以转至[Linux下redis环境搭建]学习。(https://blog.csdn.net/bajianxiaofendui/article/details/87642244)编译完成后进入redis-2.8.3/deps/hiredis目录,可以看到下面已经编译出了l...

2019-02-20 22:20:58 818

原创 Visual Studio 2010 配置Redis

Visual Studio 2010 配置Redis下载Redis开发包编译redis项目环境配置例子下载Redis开发包下载地址:https://codeload.github.com/MicrosoftArchive/redis/zip/2.8编译redis解压下载包,在msvs目录下打开RedisServer.sln工程,编译hredis项目:注意项目的运行库配置,保证使用该库的...

2019-02-18 22:08:25 1511 5

原创 Linux下redis环境搭建

Linux下redis环境搭建1,Redis 安装下载redis服务端,输入命令:wget http://download.redis.io/releases/redis-2.8.3.tar.gzredis的版本可以自己选择。对压缩包进行解压,输入命令:tar xzf redis-2.8.3.tar.gz然后进入redis-2.8.3目录,输入命令make进行编译编译完成后,...

2019-02-18 20:05:22 1133

原创 Windows下redis环境搭建

Windows下redis环境搭建1,Redis 安装,下载地址:https://github.com/MSOpenTech/redis/releases。Redis 支持 32 位和 64 位。这个需要根据你系统平台的实际情况选择,我的机器是64位,所以下载 Redis-x64-xxx.zip压缩包,解压后,将文件夹重新命名为 redis,存放路径为E盘。打开redis文件夹如图所示:...

2019-02-18 19:40:29 1207

原创 memmove和memcpy区别

memmov和memcpy区别     memcpy()和memmove()都是c语言的库函数,在头文件string.h中,作用是拷贝一定长度内存的内容。它们唯一的区别是当内存发生局部重叠时,memmove可以保证拷贝正确,memcpy拷贝的结果是未定义的(取决于编译平台内部对memcpy的优化处理)。函数声明如下:void * memmov...

2019-02-12 13:16:13 1278

原创 多线程下的单例模式实现

多线程下的单例模式实现一,单线程下的单实例1, 懒汉模式2, 饿汉模式二,多线程下的单实例1,加锁2,原子操作     单实例设计模式是我们平常接触最多的一种设计模式,它的特点在于保证一个类只有一个实例,并且对类成员的访问都是通过一个全局访问点来进行的。单实例主要用在整个场景中只能有一个该操作类对象,不允许再有其他的该操作类对象,比如:Http传...

2019-02-11 18:00:38 3206

原创 (Windbg调试四)C++死锁问题定位与分析

C++死锁问题定位与分析一,测试代码二,等待链三,死锁的定位和分析     C++程序异常一般有两种表现形式:程序崩溃和程序无响应。程序崩溃主要是由指针,数组越界等原因引起,这种情况可以直接通过在程序中加入Dump捕捉逻辑,分析dump文件,定位出崩溃的代码。程序无响应主要是由死循环和死锁两个原因

2019-02-11 11:10:59 1364

原创 (Windbg调试三)C++ delete指针后依然可以访问的问题

C++ delete指针后依然可以访问的问题一,第一个dump分析二,第二个DUMP分析三,VC6.0和VS2015下delete指针验证四,结论    &

2019-02-01 16:55:42 1583 1

原创 C++代码静态检测

C++代码静态检测一,CppCheck(下载地址:http://cppcheck.net/)1,使用CppCheck客户端检测2,在vs中使用CppCheck二,TscanCode(下载地址:https://github.com/Tencent/TscanCode)三,PVS-studio(下载地址:https://www.viva64.com/en/pvs-studio/)1,安装2,破解3,使...

2019-01-18 23:42:49 5727

原创 (Windbg调试二)Windows下c++程序崩溃问题定位

Windows下c++程序崩溃问题定位一,WinDbg调试虚拟地址 = pe头文件大小 + 最佳装载地址 +相对虚拟地址1004ff19 = 10000000 + 最佳装载地址 + 0004ef19 -》最佳装载地址 = 0x1000二,地址偏移计算验证三,通过map文件定位程序崩溃代码行数     Windows下c++程序崩溃问题定位主要依赖...

2018-12-27 20:03:24 4533 3

原创 TeamTalk客户端源码分析五

TeamTalk客户端源码分析五之HTTP请求(2)一,socket封装1,StreamingSocket2,ProxySocket二,HttpRequest三,HttpResponse类四,HttpClient五,具体功能业务举例在上一章中我们介绍了线程池的概念和基本使用,在最后的例子中,DownloadAvatarHttpOperation::processOpertion()函数中使用到了...

2018-12-24 20:18:49 954

原创 TeamTalk客户端源码分析四

TeamTalk客户端源码分析四一,IHttpOperation一,IHttpPoolModule和HttpPoolModule_Impl一,TTThread和TTHttpThread    &a

2018-12-17 19:40:07 901

原创 TeamTalk客户端源码分析三

TeamTalk客户端源码分析三一,Modules中的数据库业务类二,Sqlite中的数据库访问类1,CppSQLite3Statement2,CppSQLite3Query3,CppSQLite3DB   &am

2018-12-12 18:41:20 838

原创 TeamTalk客户端源码分析一

win_client源码分析一回调类和消息窗口类   &amp

2018-12-05 22:05:58 1190

原创 为什么一定要调用fclose函数

为什么一定要调用fclose函数带缓存的文件操作是标准C 库的实现,第一次调用带缓存的文件操作函数时标准库会自动分配内存并且读出一段固定大小的内容存储在缓存中。所以以后每次的读写操作并不是针对硬盘上的文件直接进行的,而是针对内存中的缓存的(何时从硬盘中读取文件或者向硬盘中写入文件有标准库的机制控制)。当缓存区域中的内容达到一定大小时,标准库会将该缓存内容刷新到磁盘上,此时才完成文件的真正写入。...

2018-12-03 19:14:38 2986

原创 Windows下C++实现进程间同步

Windows下C++实现进程间同步一,方法介绍二,踩过的坑三,正确方式(附代码)多线程同步在平常的使用中很常见,可以通过临界区,互斥量,事件等来实现,具体的选择依赖于不同的使用场景。但是进程同步使用的比较少,网上查找资料,也多是以多线程使用来讲解的,并不详细。刚好自己正在做一个升级程序,主程序是一个进程,升级程序是一个进程,我把所有的与升级服务端的交互全部放在了升级程序中,所以当升级程序从服务...

2018-11-26 19:19:31 3986 1

原创 DLL和进程的地址空间

DLL和进程的地址空间一,MT和MD的区别二,显示链接与隐式链接三,DLL和进程的地址空间DLL是Windows开发人员经常使用到的一种技术,比如我们经常会把相同功能的代码封装到一个模块中,然后供其他需要使用该模块的程序共同调用,可以降低代码的复用性,使用起来非常方便;而且,当我们需要对外部提供自己公司的接口时,也会考虑到使用dll,它可以将我们内部实现的代码进行封装保护,而不会暴露给使用者。本...

2018-11-05 11:38:37 1996

原创 C++ 内存泄漏检测方法

C++ 内存泄漏检测方法一,Mfc程序的内存泄漏检测二,普通c++程序的内存泄漏检测三,未完待续,,,程序中通常包含着静态存储区和栈内存。静态存储区也就是静态内存,是用来保存局部static对象、类static数据成员以及定义在任何函数之外的变量(全局变量)。栈内存用来保存定义在函数内的非static对象。分配在静态或栈内存中的对象由编译器自动创建和销毁。对于栈对象,仅在定义的程序块运行时才存在...

2018-10-26 14:43:28 472

原创 C++ TIMER与线程的关系,以及WM_TIMER消息的不准确性

C++ TIMER与线程的关系,以及WM_TIMER消息的不准确性一,SetTimer介绍二,定时器与线程的关系三,WM_TIMER的不准确性四,解决方案一,SetTimer介绍SetTimer函数定义如下:UINT_PTR SetTimer(HWND hWnd, // 窗口句柄UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器UINT...

2018-10-23 17:57:09 1970

Signal.rar

sigslot.h样例代码,支持linux编译,详细介绍请参见博客:https://blog.csdn.net/bajianxiaofendui/article/details/104579303

2020-02-29

RabbitMqTest.rar

RabbitMq的c++调用代码封装,vs2017编译环境,静态链接,代码中包含了debug和release的librabbitmq.4.lib文件,无需dll,如果需要适配不同版本的编译器,可以自己到官网下载RabbitMq c++源码即可。

2019-11-25

pexports.zip

Pexports是微软提供的一款工具,可以根据dd生成对应的def文件

2019-07-08

Windows核心编程(第5版中文版) 源码

Windows核心编程(第5版中文版) 源码;

2019-02-11

PVS-Studio破解版

PVS-Studio破解版,使用次数不再受到限制,可以集成到visual studio环境中作为插件,也可以单独运行exe。详细使用可参考我的博客https://blog.csdn.net/bajianxiaofendui/article/details/86547997

2019-01-18

VC6.0中文安装包,以及Visual Assist X for VC6.0,本人一直在使用

VC6.0中文安装包,以及Visual Assist X for VC6.0,本人一直在使用;VC6.0中文安装包,以及Visual Assist X for VC6.0,本人一直在使用;

2019-01-15

C++读取Excel,就两个文件,里面有例子,可以直接使用

C++读取Excel,就两个文件,里面有例子,可以直接使用;

2019-01-10

IO完成端口使用样例

IO完成端口使用样例,结合生产者-消费者的设计模式,实现多线程的通信,代码很简单,适合初学者,编译环境为vs2015

2018-11-14

rapidxml实现xml文件的更改

rapidxml实现xml文件的更改,支持覆盖原文件,也支持生成新文件,编译环境为vs2015,内附使用说明

2018-11-14

libjpeg实现jpg图片大小改变

使用libjpeg实现的改变图像大小的功能,内部实现原理是哈夫曼压缩编码,编译环境为vs2015,内附使用说明

2018-11-14

CppCheck软件

CppCheck是一款c++代码检测工具,可以检测代码使用规范,以及内存泄漏问题,它是一款单独的应用程序,打开之后,直接选择c++工程,即可开始检测

2018-11-09

c++读取ini文件封装类

c++读取ini文件封装类,可以直接使用,简单易上手;

2018-10-23

RapidXml读取并修改XML文件

RapidXml读取并修改XML文件,封装成单独的类,可以直接使用,调用也非常方便

2018-10-18

C++ 多线程通信方式简介并结合生产者-消费者模式代码实现

C++ 多线程通信方式简介并结合生产者-消费者模式代码实现

2018-10-15

基于live555实现的rtsp点播客户端,并将实时视频流转存为H264文件

基于live555实现的rtsp点播客户端,并将实时视频流转存为H264文件

2018-10-11

MFC实现来回滚动效果的进度条

MFC实现来回滚动效果的进度条,vs2012的编译环境,完整代码,可以直接编译运行。

2018-09-21

空空如也

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