关于C++ 回调函数理解-C++如何使用回调函数
关于C++ 回调函数理解编程中肯定会遇到在C++中使用回调函数的情况。
但是为什么要使用回调函数呢?程序模块之间的调用大致分为三种:
同步调用
回调
以及异步调用
同步调用是阻塞式的,回调模式是一种双向的调用,异步调用可以解决同步阻塞问题。
回调是异步的基础,因此回调不一定用于异步,一般同步(阻塞)的场景下也经常用到回调,比如要求执行某些操作后执行回调函数。
我们需要理解回调函数设计原理。
回调函数可以把调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。
回调可用于通知机制,即简单的一对一的观察者模式。例如,有时要在程序中设置一个计时器,每到一定时间,程序会得到相应的通知,但通知机制的实现者对我们的程序一无所知。而此时,就需有一个特定原型的函数指针,用这个指针来进行回调,来通知我们的程序事件已经发生。实际上,SetTimer() API使用了一个回调函数来通知计时器,而且,万一没有提供回调函数,它还会把一个消息发往程序的消息队列。
但是,其实回调函数是继续自C语言的,因为回调函数的原理,无非 ...
C++客户端如何解决Connect超时导致的阻塞问题
C++客户端如何解决Connect超时导致的阻塞问题这几天发现一个现象,客户端正常连接服务器时候,connect显然不会出现问题。
在异常情况下,如果是服务器出现异常,connect能够立即返回失败;
但是当客户端出现异常的情况下,分为两种情况:
一种是不插网线,客户端没有获得ip地址,在这种情况下,connect也可以立即返回错误;
二是但是当客户端插上网线,但是连接网络失败,也就是说能够获取到ip地址,但是和服务器是ping不通的。
这种情况下connect就可能会发生阻塞。 因为按照《UNIX 网络编程》中讲解,connect的在进行三次握手,如果失败情况,需要等待75s的超市时间的。
我们这里主要讨论第二种情况如何解决,可以让connect快速返回结果,不至于阻塞等待超长的时间。
如下是我的代码:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 ...
Java通过JNI调用Linux下C库详解
Java通过JNI调用Linux下C库详解1. 编译环境准备1.1 linux-C/C++编译环境需要根据实际需要,安装编译环境,gcc 或者 g++。
1.2 linux-java编译环境安装java环境,需要java/javah/javac可执行。
2. java调用JNI中间件编写(java<->JNI)2.1 创建java文件TestJNI.java如果通过maven创建工程,输入对应的groupId,在对应的路径下创建java文件。
假如路径是:cn.cmguan.saas.device.dev.test
12345678910111213141516package cn.cmguan.saas.device.dev.test;public class TestJNI{ static { System.loadLibrary("JNITest"); } public static native int testSum(int i, int j); public static n ...
最新linux-centos7.7安装mysql步骤
最新linux-centos7.7安装mysql步骤
下载mysql打包文件并解压放置到/usr/local/mysql
123wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.24-linux-glibc2.12-x86_64.tar.gzcd /usr/local/mv mysql1/mysql-5.7.24-linux-glibc2.12-x86_64 mysql
查询依赖aio库并安装
12rpm -qa|grep libaioyum install libaio-devel.x86_64
创建mysql用户和用户组
12groupadd mysqluseradd -r -g mysql mysql
创建mysql数据缓存目录
12mkdir -p /data/mysqlchown mysql:mysql -R /data/mysql
配置mysql文件:my.cnf vim /etc/my.cnf
修改内容:
1234567891011121314151617181920212223[mys ...
你会用C++编写服务端程序吗?
用C++编写服务端程序?为什么用C++编写服务器程序。这个问题看起来是很另类的,但又何尝不可。
那么换一种方式来问,如果开发一个服务器,你会选择什么语言?
我想答案会在这些语言中产生:JAVA,Python,PHP,C#,Node.JS,其他脚本语音,唯独不会想起来C,C++。
这些编程语言好像已经成了服务器的专属,我想最重要的原因是,这些语言拥有数不胜数的插件,拥有优秀的开源框架,拥有良好的开发IDE。
那么我们为什么会想到用C++开发呢?
因为我只会C++,这个答案很好。
还有人的答案是性能,但是这个答案肯定有人会满不在乎。觉得性能不够的话, 只要加机器就可以了。集群,分布式,搞起来。
然而更少的机器,意味着更低的能耗,更少的硬件投入,更少的人力资源投入去维护机器。总而言之,更低的成本。
肯定还会有人说,C++的开发速度太慢了。
开发的慢是因为:学习成本高,开发效率低,内存不安全,非常容易写出 bug。
然而这并不是绝对的。
C++也可以做到非常快速的开发。有句俗语 “脚本一时爽,重构火葬场” 说的正是脚本语言开发的项目进入维护阶段后无穷的灾难。
还有一点 ...
C++使用hiredis连接带密码的redis服务代码段
C++使用hiredis连接带密码的redis服务代码段 1234567891011121314151617181920212223redisContext *c = redisConnect("127.0.0.1", 9379); // Error flags, 0 when there is no error if (c->err) { printf("connect Redis error: %s\n", c->errstr); exit(1); } else { printf("connect Redis sucess\n"); } redisReply *reply = (redisReply *)redisCommand(c, "AUTH %s", "qKxxxRfApe2gxxxxx"); if (reply->type == REDIS_R ...
容器list使用之erase
容器list使用之erase今天程序里面使用了list容器,其中用到了erase()函数,程序竟然崩溃了。
之前一直没出现问题,感觉莫名奇妙。花了点时间,搞清楚了erase()函数的机理。
常用的删除容器中元素的方法是如下:方法1:12345678910111213list< int> List;list< int>::iterator iter;for( iter = List.begin(); iter != List.end(); ){ if(1) { iter = List.erase( iter ); } else { iter++; }}
方法2:1234567891011121314list< int> List;list< int>::iterator iter;for( iter = List.begin(); iter != List.end(); ){ if(1) ...
/bin/sh^M:bad interpreter:No such file or directory异常
/bin/sh^M: bad interpreter: No such file or directory 异常问题:经常遇到一个问题,在windows里面编辑好的文件,比如说sh脚本,传输到linux里面执行不成功,报错如下:
1/bin/sh^M: bad interpreter: No such file or directory
分析这是不同系统编码格式引起的:在windows系统中编辑的.sh文件可能有不可见字符,所以在Linux系统下执行会报以上异常信息。
解决方案假设我们的文件是:command.sh
1234567chmod 777 command.shvim command.sh:set ff 或 :set fileformat //查看文件格式//可以看到如下信息,上述情况无法执行肯定是 = dosfileformat=dos 或 fileformat=unix:set ff=unix 或 :set fileformat=unix //修改文件格式 wq //保存退出
CentOS gcc升级4.8步骤
CentOS gcc升级4.8步骤最近需要用到c++11,所以需要把gcc从4.4.7升级到4.8.1。
首先我们需要下载gcc的源码
wget http://ftp.gnu.org/gnu/gcc/gcc-4.8.1/gcc-4.8.1.tar.gz
然后解压进入目录
12tar -xvzf gcc-4.8.1.tar.gz -C /opt/gcccd /opt/gcc/gcc-4.8.1
执行如下命令:
./contrib/download_prerequisites
然后在gcc-4.8.1平级目录下创建编译目录
12cd ..mkdir build_gcc_4.8.1
接下来就是执行编译了
1234cd build_gcc_4.8.1../gcc-4.8.1/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib make -j4make install
如果在执行make 和 make install的时候没有遇到error,那么恭喜你,已经完成了gcc-4.8.1安 ...
mips环境下openssl交叉编译
mips环境下openssl交叉编译 最近需要使用openssl库,选用了 https://www.openssl.org/ 地址下的OpenSSL 1.0.1p版本。
如果只是正常环境下使用openssl,编译比较简单,只需要解压缩openssl 1.0.1p版本,然后进入根目录按照如下命令: make & make install
这样就可以在编译并安装到/user/local路径下面。
一般情况下,我们需要把openssl应用到不同的环境中,这样需要我们进行交叉编译。
以下交叉编译的步骤:
修改makefile
我们可以在openssl的根目录下找到makefile文件。需要修改的地方如下:
CC= mipsel-openwrt-linux-gcc
AR= mipsel-openwrt-linux-ar $(ARFLAGS) r
RANLIB= mipsel-openwrt-linux-ranlib
...


