- 博客(42)
- 资源 (6)
- 收藏
- 关注
原创 记录使用Promise和await的一个小坑
今天写了一段类似这样的代码function Sleep(){ return new Promise((resolve, reject)=>{ setTimeout(() => { reject("failed") }, 1000); })}async function Test1(){ let ret = await Sleep().ca...
2019-04-13 14:44:14
437
原创 浅析epoll
什么是epoll多路复用io接口select/poll的增强版本,显著提高程序在大量并发连接中只有少量活跃情况下的cpu利用率epoll的优缺点优点1. 支持大数目的FD2. IO效率不随FD数量增加而线性下降3. 使用mmap加速用户空间和内核空间的消息数据传递缺点1. 活动连接比较多的时候,频繁调用epoll_await性能会下降明显epoll的使用主要函数定义int e...
2019-04-10 12:06:44
426
原创 Session 和 Token
Cookie 、Session 和Token Cookie、Session和Token是当下互联网的两个非常重要的东西起源众所周知,http协议是无状态的,每个http请求(http 1.0)从浏览器发起请求到服务器处理完请求后,就结束了,客户端和服务器的TCP链接就断开了。一个网站服务器程序是要服务很多用户的,每天要处理非常多的这种http请求,其中每个人又会发很多这种请求,那...
2018-05-18 13:22:58
1204
翻译 getopt_long()使用方法
本文内容大部分翻译自Linux Man Page 用于学习如何解析命令行参数,其中讲解了getopt、getopt_long、getopt_long_only等函数的用法和区别。
2015-11-29 19:55:39
7801
原创 Shutdown程序源码学习笔记
本文提到的shutdown程序是cygwin下的开源程序shutdown(源码)C语言字符串操作strrchr(str, ch):该函数返回ch字符在str(C语言字符串)中最后出现的位置(即一个指针),如果不存在,则返回NULL指针。头文件:string.hstrcasecmp(str1, str2):该函数忽略大小写来比较str1和str2两个字符串的内容,如果相等则返回0,如果
2015-11-29 13:51:23
1454
原创 文件编码学习笔记
几种常见的编码ASCII:ASCII算是我们最早接触的一个编码,记得学C语言的char类型时候就开始认识它了,它的范围是0-127,它除了包含所有的英文字母和英文标点符号外还有一些不可打印的控制符号,比如制表符(0x9)、换行符(0xA)等等。GB2312:从上面可知,ASCII编码只有0-127的范围,而我们中国的汉字博大精深,经过几千年的历史和文化沉淀,常用的汉字也有好几千个,所以ASCII
2015-11-26 17:04:55
816
原创 C++与C#网络传输中的编码转换
近期的项目因为客户端用的是Unity3D(使用C#),服务端用的是C++(VS2013,Windows)。所以当他们相互传输中文字符串的时候不能正常工作。经过一番研究,把最终的解决方案分享出来。思路本方案的思路就是保证服务端和客户端间的通信使用utf8编码。所以他们在给对方发中文数据时候都要转成utf8格式。服务端方式一:因为vs2013中C++的中文字符串(比如string str="测试")是
2015-08-27 16:32:43
2382
原创 Libevent0.1之测试Libevent自带的例子
因为0.1版本的只支持linux版本,所以本文章中的测试环境是在ubuntu下进行。准备工作下载0.1版本的libevent。开始先解压下载下来的源码Download$ tar xzvf libevent-0.1.tar.gz编译库文件Download$ cd libeventDownload/libevent$ ./configureDownload/libe
2015-06-02 14:45:16
2363
原创 Libevent0.1学习之queue.h
最近打算研究一下libevent网络库,发现用了FreeBSD的queue.h中的尾队列来存储各种事件队列。下面就是一些学习queue.h的一些笔记。queue.h中定义了一系列的宏操作去实现单链表、双链表、简单队列、尾队列和循环链表。queue.h的内容见文章结尾。他们的特点对比如下: 单链表: 头部定义:一个指向第一个元素的指针 entry定义:一个指向下一个元素的指针 删除任意元素时
2015-06-02 13:44:11
2256
原创 Queue学习之Singly-Linked List
早就听说了libevent这个开源网络库的大名,刚好最近时间比较闲,所以就拜读一下。计划是从0.1版本(最早版)开始看起,因为我想看一下libevent成长历史和网络通信方面的相关技术发展。在libevent0.1版本中,核心就是event这个结构体了。而这个结构体中又用了sys/queue.h中的TAIL QUEUES。因此打算先学习一下sys/queue.h中提到的几个queue。本文将会讲解一
2015-05-27 15:58:08
2490
原创 C#操作Mysql数据库的存储过程
近期在工作中接触了一套游戏服务端的代码,它是用C#写的逻辑,其中发现在客户端登陆的时候,服务端中处理登陆验证的模块没有先对账户名的合法性进行验证,而且还直接用sql语句拼接账户名的方法去查询数据库,很明显者存在一个SQL注入漏洞,为此我对写这代码的同胞鄙视了一番。鄙视归鄙视,作为一个5好青年,当然不会让这个洞存在下去。于是,我想了一会,觉得先要对接收到的账户名做合法性验证,然后sql语句要改成存储过
2015-03-23 16:37:20
7181
原创 C++学习笔记之智能指针
引言众所周知,C++中最让程序员头疼的就是关于内存的问题,其中不外乎以下几点: 1. 缓冲区溢出 2. 野指针 3. 重复释放内存 4. 不配对的new/delete 5. 内存泄露 其中大多数的问题都是对指针的不正确使用带来的。为此C++标准库中对原始指针做了一些封装,比如auto_ptr,使得指针更容易使用,但是还是存在众多不足。而在Boost库中,对原始指针做了更多的封装,弥补了a
2015-03-18 15:45:28
835
原创 Java学习笔记之Java的String类
Java学习笔记之Java的String类String类的一些概括String类型不属于8种基本数据类型,它是一个类。String类是不可变类,任何对String对象的改变都会产生新的String对象。(所以若要使用一个内容变动大的字符串,应该用StringBuffer类)用”=”操作符创建字符串 String s0 = "test"; String s1 = "test";
2015-02-09 09:56:45
706
原创 Java学习笔记之获取当前目录或文件
近来在项目中遇到一个关于获取项目目录下配置文件的问题?在eclipse中可以正确获取配置文件,但是当项目打包成jar包后就出现"找不到文件"的异常。特此研究了一下java中获取当前目录和获取项目中文件的方法。实验代码如下import java.io.File;import java.io.IOException;import java.net.URL;public class
2014-11-13 09:59:44
1536
原创 Java学习笔记之接口和抽象类
前言最近遇到了接口和抽象类的使用,搞不明白二者的区别,所以特地研究了下而这,笔记如下。接口和抽象类的定义抽象类:包含抽象方法的一个类叫做“抽象类”。接口:可将其想象成为一个“纯”抽象类,它只声明类方法,不提供方法的实现细节。接口和抽象类的特点抽象类:1.如果一个类A继承了抽象类B,并且没有实现抽线类B中的抽象方法,
2014-10-17 21:23:23
899
原创 配置PHP中的mail方法发送邮件
我的环境:XAMPP v3.2.1准备工作1.检查有没有sendmail程序,在xampp安装目录下的sendmail文件夹下。没有则下载sendmail.zip(http://glob.com.au/sendmail/),然后解压并放在在xampp目录下。2.去mail.google.com注册一个google的邮箱,比如账号:user@gmail.com,密码:passwd
2014-01-11 10:44:36
28229
原创 windows获取时间方法
方法一:用c语言库函数中的time函数、ctime函数和ctime_s()函数time函数:头文件:time.h功能:获取当前的系统时间,返回一个time_t类型(即一个大整数)。用法:time_t time(time_t * timer)ctime函数:头文件:time.h功能:ctime功能是 把日期和时间转换为字符串用法:char *ctime
2013-11-06 13:47:39
3456
原创 引用与指针
/**************** *引用传参 ****************/#include using namespace std;void fun(int &a){ a = 1;}int main(){ int a; fun(a); cout<<a;} ;main()函数中:1000: int a;100
2013-09-09 10:56:35
662
原创 Qt中xml元素的遍历
#include #include #include #include int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); QDomDocument doc; QFile file("H:\\Soft\\QQ\\AuI18N\\2052\\StringBundle.xml"
2013-09-09 10:53:15
6248
原创 int test(a,b,c)中的形参
void test3_1(int a, int b, int c){ cout<<*(&c-2);//标记行1}void test3(){ int x,y,z; cin>>x>>y>>z; test3_1(x,y,z);}输入:1 2 3输出:1在标记行1中输出的是1,即是a的值,因为函数调用中,是按实参表从右到左的顺序把参数压入栈中,且地址从高到低所以c的地址-
2013-08-26 13:47:49
1981
原创 由5/2想到的
c/c++中有一表达式如:5/4 + 3.0/2 + 4 + 6.0 其中,5/4的结果为1,因为5和4分别为int型(c/c++中这种常量整数默认为int类型),所以他们的运算结果为int型。3.0/2的结果为1.5,因为3.0为double(c/c++中这种常量小数默认为double类型),所以他们的结果为double型。4为int型6.0为double型
2013-08-26 13:44:52
921
1
原创 由a+=a-=a*=a想到的
#include using namespace std;int main(){int a = 12;a += a -= a *= a;coutreturn 0;}结果a为:0;;;编译环境:vs2008;010914C5 mov eax,dword ptr [a] ;a*=a010914C8 im
2013-08-16 08:46:30
2957
原创 cocos2d-x的CCLayer触摸事件
假如HelloWorldLayer继承了CCLayer类,我要在HelloWorldLayer图层里写多点触摸事件。1.首先要重写下列三个函数 virtual void ccTouchesBegan(CCSet *touches,CCEvent *pEvent); virtual void ccTouchesMoved(CCSet *touches,CCEvent *pEvent);
2013-08-04 10:40:05
1871
原创 由'\\n'所想到的
编译环境:vs2008(XP) #include using namespace std;int main(){ cout<<'\\n'<<endl; return 0;}代码如上,结果是23662(5C6Eh);'\\n'中经过编译器解析后内存实际的内容是'\n',因为'\'的Assic码是5Ch(十进制92),'n'是6Eh(十进制110)#include
2013-08-01 14:16:28
855
原创 cocos2d-x 精灵触摸事件
Cocos2d-x版本:cocos2d-2.1rc0-x-2.1.3编译环境:vs2010(XP)#ifndef __TOUCHABLESPRITE_h__#define __TOUCHABLESPRITE_h__#include "cocos2d.h"USING_NS_CC;class TouchableSprite: public CCSprite, public
2013-07-30 22:42:25
2690
1
原创 《软件调试》读书笔记二
二、函数返回值1.如果返回值是EAX寄存器能够容纳的整数、字符和指针(4字节或小于4字节),那么返回值存在EAX中源代码:/** @brief: 测试函数返回值为int型的情况下,存储返回值的方法 @environment: VS2008 */#include int fun_int(void){int a;return a;}
2013-07-29 22:07:52
1076
原创 慎用CCARRAY_FOREACH
第一次使用CCARRAY_FOREACH遍历一个CCArray数组并且删除数组里的东西时发生出乎意料的结果:类似代码如下:CCArray *children = this->getChildren();CCObject *temp = NULL;CCARRAY_FOREACH(children, temp){ CCSprite *sprite = dynamic_cast
2013-07-29 10:34:34
6391
1
原创 《软件调试》读书笔记一
一、分页机制关键词:CR0、CR2、CR3、CR4、页目录、页目录表项、页表、页表项、内存页(物理内存被分成若干个特定大小的页,也叫物理页)CR0:该寄存器中的PG标志用于是否启用分页分页机制CR2:该寄存器中保存的是一个线性地址CR3:该寄存器中保存的是页目录的物理地址(指基地址)CR4:该寄存器中的PAE(Physical Address E
2013-07-28 09:38:58
1153
原创 cocox2d-x HelloWorld分析
cocos2d版本:cocos2d-2.1rc0-x-2.1.3编译环境:vs2010(XP系统)1.首先看到main.cpp中AppDelegate app;这是一个变量的定义,而且它的类型是一个类,不是基本类型,所以它会调用该类的构造函数,而且应该是默认构造函数,跳到AppDelegate类的构造函数实现中,发现函数体是空的,但是AppDelegate类是继承自CCAppl
2013-07-27 14:03:36
1525
原创 浅谈排序算法(三)之堆排序
堆排序主要思想:1.初始化数串成大顶堆(或小顶堆) 1.1 先初始化一个非叶节点的小子树为大顶堆(或小顶堆) 1.2 再初始化数串中的每个子树成大顶堆(或小顶堆)2.由步骤1中得到的堆顶即是当前未排序数串的最大值。由此继续循环得到下个最大值 堆排序与选择排序有点相似,都是先通过循环比较得到 未排序数串中的最大值,然后把它给已排序的数串中。但是选择排序中循环比较时会出
2012-05-23 22:35:42
837
原创 状态机处理文本
/***删除C/C++源代码中的注释*/#include int main( int argc, char *argv[] ){ //定义各种状态 enum{NONE,PRE_LINE,LINE,ALL,PREEND_ALL,ALL_END} state = NONE; char *fileinput, *fileoutput; FILE *fpinput, *
2012-05-14 21:33:00
898
原创 浅谈排序算法(二)之选择排序
选择排序是比较好理解的,交换操作在0和(n-1)之间,比较次数O(n^2);其中交换次数最好情况是已排序,交换0次,最坏情况是逆序,交换n-1次,而冒泡排序最坏要交换n*(n-1)/2次。选择排序主要有两个循环,外循环控制未排序的项,而内循环扫描出剩下未排序中的最大值(或最小值)代码一:int comp_asc(int a, int b) //升序{ return a -
2012-05-14 12:27:36
686
原创 浅谈排序算法(一)之冒泡排序
首先介绍的是,相对来说比较简单的冒泡排序。冒泡排序,其基本思想是(如果我们是要从小到大排序):用两个循环(暂且称为内循环和外循环吧),内循环中:从第1位开始依次比较相邻的两个数的大小,如果前一位比后一位大,则交换两个他们的值,一直比较到最后;这样一趟下来的话,那么最大的那个数就在最后那个位置了。一次内循环就可以选出一个数的正确位置。所以外循环的次数最多就是该排序数列的大小代码一:
2012-05-05 19:03:34
868
原创 c语言中的各种变量是如何存储的(二)
本次讲常量数据,常量数据一般放在.rodata段(ro代表read only)。常量数据有哪些呢,一般有字符串常量和带const的变量;代码一:int main(){ char *str = "abcdef"; return 0;}lyh@debian:~/test$ objdump -h rodata | grep
2012-04-28 12:24:26
5021
原创 c语言中的各种变量是如何存储的(-)
众所周知,c语言中有全局变量,局部变量,常量数据。。。 其中,全局变量又有初始化和不初始化。int array[1024];int main(){ return 0;}lyh@debian:~/test$ gcc -g bss.c -o bsslyh@debian:~/test$ objdump -h bss | grep bssbss: f
2012-04-26 19:10:30
2495
原创 大小端字节序的判断
/********** 环境:vc++6.0**********************/用union实现大小端字节序:/******************** * union大小字节端 ********************/union test{ short i; char str[sizeof(short)];}tt;void main(
2012-04-19 17:52:49
3404
原创 函数结束后,里面的局部变量还可以用吗
int *fun1(){ int a = 1; return &a;}int main(){ int *p =fun1(); cout *p = 100; cout return 0;}结果:*p=1*p=100以上可以看出a在fun1中是个局部变量,按理说该函数结束后,a变量应该不能访问了,但是上面的例子中,通过返回a的地址,在
2012-04-02 16:59:42
3075
1
原创 C++中的引用
引用就是对象的另一个名字--这是《c++primer》中介绍引用里的一句话;而且很多c++参考书中都有“引用是另一个对象的别名”这一说;这句话很容易让人引起误会。看下面的例子:int main(){ int a; int &b = a; a = 1; cout cout b = 2; cout cout cout cout return 0
2012-03-26 12:47:08
688
原创 UNIX环境高级编程中的apue.h和apueerror.h
相信很多一开始看《unix环境高级编程》的新手们按照书上的代码的话,会遇到编译时找不到err_sys等这类问题(因为只包含了apue.h)解决办法如下:/************** * *apueerror.h * *************/#include #include #include /* for definition of errno */#i
2012-03-21 13:28:29
4358
The Introvert Advantage How to Thrive in an Extrovert World
2014-07-01
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人