自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(32)
  • 资源 (7)
  • 收藏
  • 关注

转载 boost库在工作(32)网络服务端之二

在这个例子里,服务器对象主要使用boost::asio::io_service对象,这个对象主要用来构造异步接收数据使用,接着定义boost::asio::ip::tcp::acceptor对象,这个对象主要用来接收所有连接进来到服务器的连接,也就是起到监听的作用。在服务器类的构造函数里主要调用接受对象的async_accept方法发起监听连接的作用,就是等着客户端连接过来,如果不发起连接,是收不

2013-07-18 13:59:27 986

转载 boost库在工作(31)网络服务端之一

上面已经介绍了客户端,接着下来就要开发服务端的程序了,因为只有客户端没有服务端是成不了事的,提供不了网络服务的。像C++这种语言,越来越多的应用都是在网络服务器领域,比如像HTTP服务器、EMAIL服务器、即时通讯服务器和游戏服务器等等。由于服务器的硬件资源都是比较昂贵,要提高处理大量服务的数据量,使用C++是比较合适的,可以说最佳性价比了,使用像JAVA这样的语言性能比C++低,使用汇编又开发成

2013-07-18 13:24:47 1030

转载 boost库在工作(30)网络客户端之五

在前面已经学习到客户端同步连接服务器的处理过程,由于同步的关系,前面的代码理解起来是比较简单,也容易接受,但它有一个致命的缺陷,就是在连接过程、在等服务器回应数据时,CPU不能做别的事情,只能在那里等待。这种等待对于有界面的软件来说,是一种不能接受的表现方式。比如当用户点击连接服务器之后,就一直等在那里,什么也不能操作,就算想立即退出程序也不行,必须等服务器回应之后,或者超时连接之后,才可以操作。

2013-07-18 13:15:04 1109

转载 boost库在工作(29)网络客户端之四

当客户端连接到服务器之后,想要做什么事情呢?其实就跟一个人去看医生一样,先去挂一个号,然后再根据排队的号去看医生,然后再根据医生的处方进行治疗。因此,在客户端和服务器设计上,一般有一条重要的原则,就是作为客户端要主动发起数据给服务器,让服务器知道客户端是来做什么事情的。比如同一个服务器的端口上,可以提供很多种客户端连接,像HTTP这样的服务器,也就面临着很多不同浏览器连接上来,而服务器要区分不同的

2013-07-18 10:31:05 859

转载 boost库在工作(28)网络客户端之三

从前面的例子可以知道,一个服务可能有多条路径达到,但在网络里只能一个端点对应一个端点的通讯,多个端点只是有备无患的作用,起不到别的作用。近来,发现有一个客户的问题比较奇怪,就是这个客户的网络是有备用网络配置,当安装我公司的路由器时,就会发生很多奇怪的问题,导致网络堵塞。后来深入跟踪,并且不地抓包分析之后,发现是生成树形网络的协议包一直转发,导致网络堵塞。面对这样的问题,只能使用同一个服务器使用多网

2013-07-18 10:10:40 860

转载 boost库在工作(27)网络客户端之二

由于一台服务器上可能存在多个服务,而每个服务使用了不同的端口,因而对一台服务器的查询,就可能返回多个服务的端口。为了表示多个服务,需要使用一个列表来表达多个服务存在。而访问一个列表,通常使用迭代设计模式来访问整个列表。因此就会使用下面的代码来进行域名解释:// boost_020.cpp : Defines the entry point for the console application.

2013-07-18 09:56:09 1035

转载 boost库在工作(26)网络客户端之一

说到网络,就立即回想到1997年那时,上网只是为了收发一下EMAIL,没有别的事情可做,并且大多数还是连接成局部网的情况。在局部网时,在一个计算机房里,最多只有10多台电脑联机,这样的局部网只能干一件事情,就是玩多人网络游戏,这个多人只支持4个人一起玩。随着时间推进,到1999年时就可以上网看新闻和使用QQ了,这时网络主要用来聊天,玩游戏的机会不多,做别的事情也不行,因为网络的速度很慢。到了200

2013-07-18 09:36:00 1001

转载 boost库在工作(25)任务之五

在前面的例子里使用了一个精度只能到秒级别的定时器,对于一般应用来说,已经卓卓有余,能对付大多数的情况了。但有一天,老板让你开发一个对时间精度能到毫秒级别的定时器,就显得力不从心,左思右想不得其解。假如在嵌入式系统里,往往可以直接操作定时器来实现,但在PC系统里,就不能直接操作硬件了,更何况操作系统还存在进程调度的中断,因此定时器的精度就大大打折扣。在boost库里提供了boost::asio::h

2013-07-18 09:17:41 1119

转载 boost库在工作(24)任务之四

在软件开发里,经常会遇到这样的情况,比如客户让我们开发的软件要求每隔半小时,就要备份一次数据,以便避免数据丢失。又比如在开发一个游戏网络服务器时,需要不断检查客户端连接上来的数据连接是否还有效,这时也需要使用一个任务来检查客户端的连接是否还有心跳包过来,如果没有心跳包,就可以把这个连接断开,释放相关的资源,避免服务器的资源永远占用,导致服务器运行时间长了就会死机。面对这些情况,在有界面的情况下,往

2013-07-17 14:37:24 1092 2

转载 boost库在工作(23)任务之三

在前面的多任务执行里,因为有多个线程执行,只要放到任务队列里的任务都会执行,但这些任务执行顺序是随机的,没有固定的顺序,也就是说放入队列早的任务不一定就是早执行,放入队列迟的任务也不一定后执行。这样没有顺序的执行性是多线程的本来特性,虽然可以使用锁对象来同步一个对象不被多个线程同时访问,但它是没有办法确保任务之间的有序访问同一个资源。这时,就需要引入一个对象io_service::strand,有

2013-07-17 14:34:33 997

转载 boost库在工作(22)任务之二

往往我们开发出来的产品,都是运行在不同的国家,不同的地区,不同生活水平的用户,因而软件产品会运行在不同的环境的电脑里。比如富裕国家里的电脑硬件资源,都比较好,如果还是按低配置电脑的水平设计,显示不会满足用户的要求。但是按高配置要求的硬件资源来设计,行吗?也不行,比如软件安装到工厂这样节约资源的电脑硬件资源里,就会运行不起来,或者说不流畅。因此,在设计软件产品时,需要动态适应电脑运行环境,或者根据电

2013-07-17 14:29:59 1080

转载 boost库在工作(21)任务之一

在软件开发里,常常遇到多个任务同时添加的情况,比如用户要下载一部电视连续剧,就会一起添加几十集,让它一集一集地下载。如果这时使用线程池来运行,就需要这个任务队列可以多个线程同时访问它,如果队列里没有任务时,可以让多个线程等着,只要有任务到达,就立即运行。在boost库里提供了一个强大的任务队列,这个队列可以使用线程池访问,也可以当任务为空时阻塞线程。使用这个任务队列,可以让多个任务动态运行,以及适

2013-07-17 14:23:47 931

转载 boost库在工作(20)线程之五

通过上面的学习,基本上就可以使用线程了,但怎么样让线程运行类里的成员函数呢?以便封装得更方便使用了。接着下来,就看这个例子,如下:// boost_013.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include #include #include //封装线程组运

2013-07-17 14:20:41 959

转载 boost库在工作(19)线程之四

从前面也看到使用锁boost::mutex时,如果不小心就会死锁,这样要费心费力去维护这样的代码,在boost库里提供同一个函数递归调用时使用的锁boost::recursive_mutex,当同一个线程调用时,碰到相同已经上锁的锁时,还可以继续往下执行。这时就不用担心同一个线程调用不同的函数时造成死锁了。在前面的例子死锁的代码,当换成这个锁之后,就不会再有死锁了,代码如下:// boost_01

2013-07-17 14:18:18 1038

转载 boost库在工作(18)线程之三

前面的例子里, 由于cout输出并不是多线程安全的,如果多个线程同时输出,可能导致死锁的出现,因此在那个函数添加了一个boost::mutex锁,以便同步多个输出的线程,这样就不会造成死锁了。在这个函数里,还使用一个类boost::lock_guard,这个类是一个自动锁的类,所谓的自动锁,就是在构造函数里调用上锁函数,在析造函数里调用解锁函数,这样在这个类boost::lock_guard声明的

2013-07-17 14:16:58 851

转载 boost库在工作(17)线程之二

前面的例子,还是过于简单,只能学会使用一个线程来调用一个函数来运行。接着下来,我们提高一点要求,使用两个或两个以上的线程来运行同一个函数。多个线程运行同一个函数,其实就是线程池的概念,因为一个线程只能在一个CPU在里运行,如果有四个CPU,那么最高效率就是有八个线程运行,一般来说是CPU的个数的两倍是最高效率的线程模型。因此,我们开发的软件会在不同的客户电脑上运行,不同的客户那里的电脑配置又不一样

2013-07-17 14:15:18 862

转载 boost库在工作(16)线程之一

学习线程,得先了解线程是什么,线程就是程序执行中运行的最小单元,其实它就是一种轻量的进程,运行的效果跟进程一样,但它的创建和删除比进程要快得多。在现代的操作系统里,都是以线程作为最小的调度单位。在任何一个程序里,都至少有一个线程在运行的,如果没有线程,这个程序是没有办法执行起来。因此,线程就相当汽车里的发动机,如果汽车没有发动机,就没有动力输出,也就没有办法跑起来。因而,线程也与发动机一样是重要,

2013-07-17 14:13:47 861

转载 boost库在工作(15)绑定器与函数对象之三

前面已经可以优美地解决两个参数的函数给算法for_each调用了,但是又会遇到这样的一种情况,当需要三个参数或者三个以上的参数给算法for_each调用呢?从STL里的绑定器bind1st,显然是不行了,因为它最多只支持两个参数,那还有什么办法呢?这时就需要使用boost库里强大的绑定器bind了。它不仅适用的情况比STL库里的多,还更加方便,更加人性化。下面就来看看怎么样绑定三个参数的类成员函数

2013-07-17 11:57:18 967

转载 boost库在工作(14)绑定器与函数对象之二

在STL库里使用算法for_each可以实现容器里每个元素都进行运算的操作,但for_each要求函数对象只能接收一个参数,如果需要传入两个函数时,就需要使用绑定器了。下面设想有这么一个需求,学校里老师给软件开发人员提了一个需求,要求把学生的数学成绩计算平均分,最后还需要计算每个人成绩跟平均分的差距,以便让每个学生看到自己成绩的好与坏。面对这个需求,就可以使用STL里的算法实现如下://使用bin

2013-07-17 11:55:37 938

转载 boost库在工作(13)绑定器与函数对象之一

在STL模板库里提供两个绑定器:bind1st和bind2nd,这两个绑定器只支持两个参数,如果是两个以上的参数,就无能为力了。下面先来看看这两个绑定器的使用例子,如下:// boost_008.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include #include

2013-07-17 11:53:19 957

转载 boost库在工作(12)引用计数的智能指针intrusive_ptr

当我们在维护旧代码时,很多情况是身不由己的,想从头来开发,又需要时间过多,投入成本过多,老板当然不愿意。想继续使用旧的代码,又需要投入过多的维护成本。要想在这种情况下,提高代码的维护性,又减少出错,因而想引入智能指针管理。比如已经存在引用计数的对象时,如果再想使用智能指针shared_ptr来管理,显然达不目标了,那么怎么办呢?就这样放弃智能指针的使用吗?显然不行,有没有更好的方法呢?在boost

2013-07-17 11:51:39 739

转载 boost库在工作(11)引用计数的智能指针weak_ptr

由于boost库里的shared_ptr采用引用计数的技术,这个技术天生就存在一个缺陷,就是不能存在循环引用的情况,因为这个缺点,引用计数的技术一直没有用到垃圾回收的算法里。既然存在这方面的问题,作为C++强大的boost库,一定会想办法解决的。因此,就提出另外一个智能指针weak_ptr。这个智能指针只对引用的指针进行保存,但不增加引用指针的计数,因而它不对shared_ptr的指针具有拥有权,

2013-07-17 11:26:32 680

转载 boost库在工作(10)引用计数的智能指针shared_array

在共享指针里,有时也需要共享一个缓冲区,比如从网络收到数据,需要先放到缓冲区里,接着把这些数据发送给处理线程进行解包和处理。在这里就需要使用到两个线程里共享缓冲区的问题,因此比较好的解决方案,就采用引用计数的智能指针shared_array来解决,最为合适不过了。shared_array与shared_ptr具有相同的形式,使用和注意点也是相似的。具体的使用的例子如下:// boost_005

2013-07-17 11:23:52 1706

转载 boost库在工作(9)引用计数的智能指针shared_ptr之二

接着下来,需要演示一下怎么样在多个对象里共享一个对象,而不管每个对象的生命周期,就可以及时地把使用的对象在合适地方删除。下面的例子里先定义两个类,然后每个类都引用共享的对象,接着使用完成后,就会在析构函数里删除,可以从例子程序运行的输出结果看到内部运行的生命周期。有了共享智能指针,面对多个对象共享使用一个对象,这样的管理会方便很多。具体代码如下://在两个对象之间共享使用shared_ptr

2013-07-17 08:02:56 1158

转载 boost库在工作(8)引用计数的智能指针shared_ptr之一

在前面已经介绍了三个智能指针,它们都是适合在局部作用域,不进行拷贝的情况下使用,最为合适,如果使用到其它情况,使用的好处跟坏处一样多,这种情况就不宜使用了。在目前多核处理器流行的今天,并发处理已经成为常事,因为多线程运行的高效性,界面操作人性化方面,都需要并发性处理。比如界面需要一直响应用户的操作,但后台的任务又需要有序地进行,只能阻塞在那里。这时,如果使用单线程,就显然人机操作界面不好了。在采用

2013-07-17 07:14:28 1092

转载 boost库在工作(7)使用数组智能指针scoped_array

学习过C++的开发人员,都知道在C++里数组指针与一般的指针是有区别的。比如使用数组形式分配的内存,就需要使用数组的形式删除。但初学开发的开发人员,往往会忘记这点,如下面所示:char*  pBuf = new char[256];......这里使用delete pBuf; 在最后这行代码上,就使用出错了。应该使用数组的形式删除,否则只删除了一个元素占用的内存,其

2013-07-16 08:08:53 1198

转载 boost库在工作(6)作用域智能指针scoped_ptr之五

通过前面智能指针的学习,应了解到std::auto_ptr的使用和局限性,从而引发boost库针对这些情况提供了更多的智能指针,其中scoped_ptr就是针对std::auto_ptr的而提供的。对开发人员来说,代码限制得越精确,编译器发现尽可能多的错误,就是越好的方式。比如想要某个变量不能改变它的值,就需要常量限定符,这样就可以杜绝任何不小心对变量的操作。在普通的指针里,也常常使用const来

2013-07-16 08:06:36 801

转载 boost库在工作(5)作用域智能指针scoped_ptr之四

第二种情况,主要就是使用在调用异常抛出的函数的地方。如下面的例子://异常抛出的函数,适合使用智能指针。void ThrowFun(void){ if (1) { throw "Test Throw!"; } }void TestCallThrow(void){ std::auto_ptr nVal(new int); ThrowFun();//这里抛出异常,分配

2013-07-16 08:04:32 628

转载 boost库在工作(4)作用域智能指针scoped_ptr之三

标准模板库里的智能指针std::auto_ptr,一般情况下,只适合在函数中使用,当离开这个函数时,就可以自动删除分配的资源。典型的情况有两种,一种是当一个函数代码比较多,判断条件很多,这样出口很多。另一种就是带有异常机制的代码,因为异常没有抛出来之前,没有办法确定那行代码会突然间就退出来,这种情况下对资源管理,会给软件开发人员带来很大的压力,即使很有经验的开发人员,也有点防不防的,会花大量的时间

2013-07-16 08:01:23 775

转载 boost库在工作(3)作用域智能指针scoped_ptr之二

智能指针的原理,其实就是利用C++的一个特性,当对象创建时,一定会调用构造函数;当对象离开作用域时,会自动调用析构函数。由于这两个函数的调用都是由编译器来生成的,不用怕不调用的危险,达到安全删除的目的。当然,智能指针使用了一个对象的构造和析构,显示增加了一些开销,但比起垃圾回收机制来说,是非常小的,基本可以忽略不计。 既然智能指针已经有这么多优点,迫不及待了吧,怎么样使用呢?下面就

2013-07-16 07:56:04 796

转载 boost库在工作(2)作用域智能指针scoped_ptr之一

很久远以前,丹尼斯.里奇发明了C语言,这个语言有一个优点,就是可以动态地分配内存。当需要使用内存时,就可以立即向系统申请。当不需要时,又可以立即释放回给系统,再给别的程序使用。这种动态的内存管理,使得当时以K计算的内存时代,也可以处理很大数据量的软件出现。但这中使用函数malloc来分配内存,使用函数free来释放内存的机制,一直到今天,还在使用。不过,这种方式有一个缺点,就是当你不断地使用函数m

2013-07-16 07:54:00 647

转载 boost库在工作(1)第一个例子

C++是一门博大高深的语言,提供了众多编程模式,以及其技术,其中有一项重要的技术,叫做模板技术。所谓的模板,就是提供一套函数或类,其中参数或成员是没有定义为特定类型,由使用者来定义它的类型。最开始这项技术主要用来解决容器类的问题,比如int、float类型的容器,就需要编写两个类才能解决。而采用模板技术之后,就算有N种类型,只需编写一个容器类就解决了,这样不仅提高了开发效率,也减少了代码的编写量,

2013-07-16 07:52:13 812

jdk-1.8.0_211-linux-x64.tar.gz

国外网站下载太慢,留一份自己用

2021-04-16

vsftpInstall.zip

通过vsftp快速在centos7系统上搭建ftp服务,省去配置过程,一步到位。

2021-02-02

linux-4.19.155.tar.gz

linux 4.19.155版本内核源码

2021-01-18

librdkafka-master

针对c语言封装的kafka接口

2019-10-22

mysql-connector-odbc-noinstall-5.1.13-winx64.zip

64位myodbc。使用方法见本人博客:http://blog.csdn.net/superbfly/article/details/51273808

2016-04-28

mysql-connector-odbc-noinstall-5.1.13-winx64

64位安装包,使用步骤见本人博客。

2016-04-28

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

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