- 博客(47)
- 资源 (63)
- 问答 (1)
- 收藏
- 关注
原创 PE文件格式
Windows PE文件格式的图片: 请下载或者放大后查看。 上图中对部分字段的解释使用“未知”等字样,需要了解每个字段的详细意义,可以参考《Windows PE权威指南》上图中定义的PE格式都可以从winnt.h文件找到对应的定义(从14862行开始):...
2017-12-31 00:23:40 98422
原创 纯ASCII字符图片生成
阅读过开源库源码的同学,一定记得源码文件开始出的纯字符logo,如curl库的logo: 推荐一个将图片转出纯ASCII字符的网站: picascii这个网站是将图片转成纯ASCII字符。如果需要将文字转出ASCII字符,可以先将文字截图保存为图片,在使用该网站来转。
2017-12-30 14:13:09 101401 53
原创 ASCII流程图
看过RFC文档的同学一定对它上面的纯字符流程图记忆犹新,今天推荐一个专门画这种ASCII流程图的网站: asciiflow
2017-12-30 14:07:14 92534 1
转载 告别忙、累、压力大、没成绩
有人问我这个问题: 我做软件开发工作,一直996的节奏,起初因为公司繁杂的流程不熟悉,工作效率没有那么高,所以感觉加班996并无所谓。 可是,在熟悉开发流程的情况下,效率提高了,却有一种做得越多,任务越多的感觉。做得越快,领导给的任务越多,最后越做不完……最近已经从以前的9点下班开始拖到10点半…… 在这种情况下,有种要把已经掌握的技术重复用10年的感觉,根本没有时间学习提升自己
2017-12-30 13:28:45 425
转载 程序员如何提升自身价值
程序员薪水有高有低,有的人一个月可能拿30K、50K,有的人可能只有2K、3K。同样有五年工作经验的程序员,可能一个人每月拿20K,一个拿5K。是什么因素导致了这种差异?我特意总结了容易导致薪水低的九大行为表现,避开这些大坑,你就离高薪不远了。习惯即刻回报他不懂得只有春天播种,秋天才会有收获。刚刚付出一点点,甚至还没有付出,就想要得到回报。技术刚刚掌握,能一边百度一边干活了就觉得该拿到
2017-12-30 13:08:55 130796 4
原创 网络协议 -- UDP协议(5)UDP的IOCP实现
关于IOCP网络模型的介绍可以参考:http://blog.csdn.net/china_jeffery/article/details/78815373 IOCP模型对协议是没限制的,无论是TCP还是UDP都是支持的。 UDP的IOCP模型实现的不同之处在于投递发送请求和接受请求所用的函数不同:int WSARecvFrom( SOCKET s, LPWSABUF lpBuffe
2017-12-29 18:02:19 100891
原创 网络协议 -- UDP协议(4)组播
组播就是将数据发送到一组主机。接收端如果要接收消息,则需要加入到该分组,分组是用IP来标识的。 从网络协议–UDP协议(1)介绍可以知道,适用于分组的IP有224.0.0.0 ~ 239.255.255.255。 同样,发送端就需要将数据发送到该分组IP。一、发送端#include #pragma comment(lib, "Ws2_32.lib")void SendLog
2017-12-29 17:12:43 100379 2
原创 网络协议 -- UDP协议(3)广播
UDP的广播和单播的不同在于发送端(接收端的实现和单播方式没有区别)的实现上: 1. 发送端将套接字配置为发送广播消息,使用setsockopt函数。 2. 发送地址更改为受限的广播地址255.255.255.255。 需要说明的是广播地址不仅仅只有255.255.255.255一个。广播地址分为受限的广播、指向网络的广播、指向子网的广播、指向所有子网的网广播。255.255.255.
2017-12-29 16:36:11 98146
原创 网络协议 -- UDP协议(2)单播
一、发送端因为UDP不是面向连接的,且不可靠的,所以发送端在调用sendto之后,就算sendto返回成功,也不代表接收端一定收到了数据,可能接收端压根都没启动,也是有可能的。不能根据sendto的返回值来确保接收端一定收到了数据。如果需要数据传输的可靠性得到保证,可以使用TCP或者通过业务逻辑来保证。#include #pragma comment(lib, "Ws2_32.lib
2017-12-29 16:01:51 97358
原创 WinDbg -- 调试关键区(CriticalSection)死锁
一. 演示示例这里一个有关键区锁死问题的程序,运行之后依次点击“CS锁死”按钮、右上角退出按钮,程序就会卡死。(图1) 对于眼下的这个问题,界面完全失去响应,这说明负责消息处理的UI线程阻塞了。对于几乎所有的windows GUI程序,编号为0的初始线程就是UI线程,windows发现该界面一段时间没有消息响应之后就会在标题后面加上“(未响应)”。二. WinDbg调试启动Windbg,附加到
2017-12-28 23:55:00 95170
原创 WinDbg -- 调试互斥体(Mutex)死锁
一. 演示用例#include <windows.h>#include <tchar.h>#include <process.h>HANDLE hMutexA = NULL;HANDLE hMutexB = NULL;unsigned __stdcall ThreadProc1(void * pArg) { WaitForSingleObject(hMutexA, INFINITE);
2017-12-28 23:45:29 97304
原创 网络协议 -- IP地址
本文介绍在网络编程中涉及到的与IP地址相关的操作。关于IP的分类等基础知识,可以参考:网络协议 – 基础概念一、相关结构体struct in_addr// sizeof(in_addr) == sizeof(ULONG) == 4//typedef struct in_addr { union { struct { UCH
2017-12-28 22:03:54 96139
原创 网络协议 -- UDP协议(1)介绍
一、什么是UDP协议?UDP是User Datagram Protocol的简称,中文名是用户数据报协议,是OSI参考模型中的传输层协议,它是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。 UDP的正式规范是IETF RFC768。UDP在IP报文的协议号是17。 ISO七层模型: 1.1 UDP报头UDP报头的结构如图: UDP报头由4个部...
2017-12-28 16:12:59 134566 1
原创 使用VSLinux插件开发和调试
一、写在前面从事Windows平台C++开发的时候顺其自然的一直使用visual studio进行开发和调试,对VS的强大并没有太大的感觉。从事Linux平台的开发工作后,折腾Vim配置,安装YCM等各种插件,代码提示,函数列表等各种功能都有了,可以顺利开发了,但用了一段时间后总觉得差点什么,还是和vs有些差距。俗话说没比较就没伤害,转眼看看VS+VAssistX,感觉vim瞬间被秒成渣渣,不可否认
2017-12-27 23:14:13 82656 1
原创 Google C++编程规范
个人认为google的C++编码规范实用性强,相较于微软的编码规范更加简单明了.一、文件命名文件名要全部小写,可以包含下划线(_)或短线(-)。my_useful_class.ccmy-useful-class.ccmyusefulclass.cc二、类型命令类型命名每个单词以大写字母开头,不包含下划线:MyExcitingClass、 MyExciti...
2017-12-27 23:07:24 82583 2
原创 freopen实现标准流重定向到文件
标准流指的是:标准输入流stdin、标准输出流stdout、标准错误流stderr。 freopen可以实现流的重定向,把预定义的标准流重定向到指定的文件中。FILE * freopen ( const char * filename, const char * mode, FILE * stream );使用方法如下:int _tmain(int argc, _TCHAR* argv[]){
2017-12-27 23:00:10 82450 1
原创 NSIS教程(4): 调用Windows API
NSIS调用win32 API(也可以是其他dll提供的导出接口)需要通过System::Call来调用,调用语法如下:System::Call PROC [( PARAMS ) [RETURN [? OPTIONS]]]每个参数由三个值组合而成: 类型、源、目标。注意是每个参数都是由三个值组合而成。 类型:可以是一个整数,一个字串,等等。 源: 就是参数值的源,可以是一个 NSI
2017-12-27 22:54:33 84407
原创 NSIS教程(5): 静默安装
常用的静默安装有2种: 1. 在脚本中加入SilentInstall 和 SilentUninstall 命令 2. 在程序启动参数里加 /S 参数(区分大小写) 要判断安装、卸载程序是否静默可以使用 IfSilent:# 安装操作开始前.Function .onInit IfSilent +2 +1 MessageBox MB_ICONQUESTION|MB...
2017-12-27 22:43:22 93019 6
原创 1900年代中国
Albert Kahn 1860年3月3日生于法国 Marmoutier 城,而立之年投身银行业。 到了四十多岁,他认为工业革命正在导致世界巨变,很多文化古迹都可能会消亡,就想把这些都记录下来。 于是他就开始了逐梦摄影圈的环游世界之旅,雇佣了多名摄影师,采用了当时最先进的 Autochrome 彩色摄影技术,拍摄了上万张彩色照片,组成了一套“地球档案(les Archives de la Planè
2017-12-27 20:24:54 816
原创 C++ 匿名对象
在webRTC的源码中有如下函数:template T>std::unique_ptr WrapUnique(T* ptr) { return std::unique_ptr(ptr);}该函数不复杂,但重点在于它直接返回了一个std::unique_ptr。我们知道std::unique_ptr是不能够直接拷贝构造的,如:std::unique_ptr::string
2017-12-25 16:01:42 95852
原创 WebRTC--添加IOCP网络模型支持
一、起因webRTC在windows平台默认使用的是WSAAsyncSelect模型,该模型需要有一个windows窗口的支持,而且伸缩性、性能都比较低。 关于WSAAsyncSelect模型的介绍可以参考Windows套接字I/O模型(3) – WSAAsyncSelect模型因为webRTC是点对点的数据传输,对每一个端的性能要求并不高,采用WSAAsyncSelect模型完全是足够的。但
2017-12-25 15:10:43 94620
原创 Windows内存体系(6) -- 彻底理解内存对齐
一、内存为什么要对齐虽然所有的变量都是保存在特定地址的内存中,但最好还是按照内存对齐的要求来存储。这主要出于两个方面的原因考虑: 平台原因: 不是所有的硬件平台(特别是嵌入式系统中使用的低端处理器)都能访问任意地址上的任意数据,某些硬件平台只能访问对齐的地址,否则会出现硬件异常。 性能原因: 如果数据存放在未对齐的内存空间中,则处理器访问变量时需要进行两次内存访问才能完整读取该...
2017-12-24 23:40:51 94747 3
原创 w3m浏览器
w3m是一个基于文本的网页浏览器,支持多种操作系统,在命令行终端可以很好的支持中文。即使在没有鼠标支持的情况下也可以检查网页的输出。本文列出常用的快捷键。一、安装在大多数的linux发行版本中并不默认包含w3m浏览器,需要我们手动安装,我们需要2个包,w3m和w3m-img,w3m-img包支持在w3m浏览器中显示图片,在ubuntu下使用apt-get install 安装。
2017-12-24 23:33:47 95266
原创 DebugView远程查看日志
我们一般都是在程序运行的本地电脑使用debugview查看日志输出,但其实debugview也支持C/S模式(服务端-客户端模式)的日志查看方式,通过这种方式我们就可以通过debugview远程查看某一台计算机上的日志输出了。使用方式: 1. 在远端运行debugview作为服务端。debugview.exe /a在近端(需要查看日志的计算机)运行debugview,点击connect,输入远端
2017-12-24 23:18:48 94161
原创 windows平台编译ffmpeg
1. 安装MinGW和msys.使用mingw在线安装工具安装mingw和msys其到F盘,位置可以任意指定.点击Installation –> Apply开始安装。修改F:\MinGW\msys\1.0\etc目录下的fstab.sample文件名为fstab,在文件中输入如下内容:安装完成以后执行msys.bat文件启动一个类似Linux终端的对话框,现在将会在F:\Mi...
2017-12-24 22:54:14 92359
原创 MySQL存储过程模板
MySQL存储过程的范例模板,带返回值和异常处理的功能。DROP PROCEDURE IF EXISTS sp_sample;CREATE PROCEDURE sp_sample(OUT errno INT)root:BEGIN /* 功能: IN参数: OUT参数: errno 存储过程异常标志(0-成功, 1-异常)
2017-12-24 22:22:51 92278
原创 WebRTC--rtc_base库移植
rtc_base是webrtc的基础库,也是一个不可多得的跨平台的基础库,它提供了线程、网络、指针等多个方面的支持。 我们可以将它单独提取出来加以改造,然后使用。 rtc_base库位于src\rtc_base文件夹中。 我们将其移到单独的visual studio工程中,并使用cl.exe编译为静态库。 虽然使用gn gen --ide=vs out/Debug命令生成的visual
2017-12-24 21:42:26 94551
转载 大道至简,职场上做人做事做管理
大道至简,越是根源和基本的问题,道理实际上越简单。关于如何做人、做事、做管理的书很多,我看得不多,但是我觉得这些书更多是侧重技术和实现细节上的,而很少从人的思想和观念去讲。实际上,从根本上去说,如何做人做事是世界观的问题,也是一个哲学话题。很多人和我一样,已经到了快30的年纪,是需要去思考一下应该如何做人如何做事的,也需要一套简单、有效、完整的体系来指导自己,而这套体系将是让自己安身立命于这个世界
2017-12-21 19:16:53 91028
原创 Windows套接字I/O模型(5) -- 完成端口模型
一、写在前面前面介绍了套接字I/O的同步模型、WSAAsyncSelect模型、WSAEventSelect模型,套接字I/O还剩下2个模型没有介绍:重叠模型,完成端口模型。 如果程序对性能和并发要求不高,可以使用前面介绍的WSAEventSelect模型;如果对性能和并发有要求,可以使用本文介绍的完成端口模型。 因为完成端口模型是基于重叠模型的,且在易用性、可伸缩性等方面都高于重叠模型...
2017-12-15 17:38:55 91970 2
原创 CONTAINING_RECORD宏的实现原理
在使用windows完成端口时,会使用到CONTAINING_RECORD宏,该宏的作用就是:根据结构体中的某成员的地址来推算出该结构体整体的地址,相当于一个万能公式。 下面代码的注释中,讲解了该宏的实现原理。#include #include int main(){ struct T { int a; int b;
2017-12-14 12:30:53 90465
原创 标准库std::min/std::max与min/max宏冲突
如题,因为windef.h中定义了max和min宏:#ifndef NOMINMAX#ifndef max#define max(a,b) (((a) > (b)) ? (a) : (b))#endif#ifndef min#define min(a,b) (((a) < (b)) ? (a) : (b))#endif#endif /* NOMI
2017-12-14 12:04:47 99213
原创 MD5
一、MD5介绍MD5是MD5消息摘要算法的简称(英语:MD5 Message-Digest Algorithm),是一种广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(即哈希值),用于确保信息传输的完整性。MD5由罗纳德·李维斯特设计,于1992年公开,用以取代MD4算法。这套算法的程序在RFC 1321 中被加以规范。 将数据(如一段文字)运算变为另一固定长度值,是散列
2017-12-13 10:35:53 95967 1
原创 windows程序单实例
// pszUniqueName需要以Global\\开头,且需保证事件名在整个计算机上唯一,可以使用GUID // BOOL CheckSingleInstance(LPCTSTR pszUniqueName) { HANDLE hMutex = CreateEvent(NULL, TRUE, FALSE, pszUniqueName); DWOR
2017-12-13 10:26:22 89811
原创 字符串格式化函数引起的崩溃
一. 问题描述我们常用的格式化字符串函数有:HRESULT StringCchVPrintf( _Out_ LPTSTR pszDest, _In_ size_t cchDest, _In_ LPCTSTR pszFormat, _In_ va_list argList);int printf ( const char * format, ... );...
2017-12-12 23:11:25 91320
原创 Windows套接字I/O模型(4) -- WSAEventSelect模型
一、WSAEventSelect模型介绍WSAEventSelect模型和WSAAsyncSelect模型类似,它也允许应用程序在一个或多个套接字上面,接收以事件为基础的网络事件通知。该模型和WSAAsyncSelect模型的最主要的区别在于,网络事件是由事件对象句柄完成的,而不是通过窗口消息完成的。该模型要求应用程序针对打算使用的每一个套接字都创建一个事件对象。创建方法是就是调用WSAC...
2017-12-12 21:11:17 89744
原创 Windows套接字I/O模型(3) -- WSAAsyncSelect模型
一、WSAAsyncSelect模型介绍利用WSAAsyncSelect模型,结合windows窗口消息循环,应用程序可以在一个套接字上,接收以windows消息为基础的网络事件通知。要想使用WSAAsyncSelect模型,首先必须创建一个窗口,并为窗口提供一个窗口过程支持函数。int WSAAsyncSelect( _In_ SOCKET s, _In_ HWND
2017-12-12 16:14:24 89776
原创 OutputDebugString完美封装
C/C++开发中经常需要输出调试信息,我们一般使用OutputDebugString输出到DebugView或者调试器输出窗口。 OutputDebugString原型如下:void WINAPI OutputDebugString( LPCTSTR lpOutputString);它只支持一个字符串参数。 在实际使用中,一般都会将其封装,支持可变参数,方便调用。封装了2
2017-12-12 14:48:37 90191 2
原创 Windows套接字I/O模型(2) -- Select模型
一、Select模型介绍套接字I/O Select模型的“中心思想”便是利用select函数,实现对I/O的管理。利用select函数判断套接字(一个或多个)上是否存在数据,或者能否向套接字写入数据。它也是同步的,也会阻塞。但和套接字I/O阻塞模型不同的是,Select模型可以同时管理多个Socket。select函数原型:int select ( int nfds,
2017-12-11 22:19:34 89123
原创 Windows套接字I/O模型(1) -- 阻塞模型
一、服务端服务端大致流程: 1. 创建Socket 2. Bind端口 3. 开始Listen 4. accept客户端连接 5. send数据到客户端 6. recv数据从客户端 7. close socket#include <winsock2.h>#include <iostream>#include <assert.h>using namespace std;#pragma
2017-12-11 16:55:51 88870
原创 C++ 类型转换
static_cast只提供编译时的类型检查,没有运行时类型检查。完全不相干类型之间的转换是不允许的,编译器会报错。进行上行转换(把子类的指针或引用转换成基类表示)是安全的;虽然也允许进行下行转换(把基类指针或引用转换成子类表示)时,但由于没有动态类型检查,所以是不安全的。用于基本数据类型之间的转换,支持占用不同存储空间的基本类型的转化,但这种转换的安全性也要开发人员来保证。支持vo...
2017-12-11 14:10:15 88467
基于NSIS Modern界面制作的网易云音乐安装包
2018-01-18
基于NSIS传统界面制作的网易云音乐安装包
2018-01-18
NSIS用户手册 中文版
2018-01-17
automate-git.zip
2019-07-13
ffmpeg-20180427-4833050-win64-static
2018-04-28
区块链技术解决方案和安全性方面的问题
2017-12-06
TA创建的收藏夹 TA关注的收藏夹
TA关注的人