- 博客(52)
- 收藏
- 关注
原创 ZLMediaKit基础设施类 RingBuffer 相关
这几个类在推流流程中使用的,数据流转的基本设施类。1,RingBuffer,_RingReaderDispatcher,_RingReader都有一个_RingStorage类型的共享变量。2,RingBuffer本身并不保存数据,数据的保存是通过_RingStorage类变量进行保存。3,_RingStorage其实保存的是数据的共享类型指针,通过一个deque保存。定义为deque<pair<bool, T> > _data_cache; 并设置最大记...
2022-03-05 16:27:46
733
原创 C++ 11 学习之 ZLMediaKit代码分析解读---EventPoller
EventPoller是整个ZLMediaKit中事件和线程调用的最核心的类,一般会有和cpu核心数量一致的线程数量,统一检测各种文件句柄或者网络句柄读写事件,定时器触发等 EventPollerPool,实现Singleton模式,通过instance 接口,在实际的构造函数中,创建 当前cpu核心数量的 EventPoller事件检测线程 class EventPollerPool : public std::enable_shared_from_this...
2021-05-12 22:33:53
2019
原创 C++ 11 学习之 ZLMediaKit代码分析解读---NoticeCenter
类NoticeCenter,是全局的一个事件订阅分发的松耦合机制。通过一个静态的 instance函数,获取全局的NoticeCenter对象,进行addListener ,emitEvent等主要接口的调用。 EventDispatcher中的主要成员变量 typedef unordered_multimap<void *, std::shared_ptr<void> > MapType;MapType _mapListener; ...
2021-05-12 17:32:11
1133
原创 C++ 11 学习之 ZLMediaKit代码分析解读---Timer
Timer是一个简单的定时器实现辅助类。通过在构造函数中设置一个 function类型的 callbacl函数,以及时间间隔,当程序执行时,基于ZLToolkit内部的EventPoller事件循环,会定时调用回调, 来达到定时器的作用。ZLToolKit中,使用了大量的lambda以及function,充当回调函数,某种意义上class Timer {public: typedef std::shared_ptr<Timer> Ptr;...
2021-05-10 21:35:13
1677
原创 MYSQL更改安装目录
最近需要更换MYSQL的原始安装目录,网上各种说法都有,不是很统一,下面是自己实际操作的结果,进行简单的记录假设目标目录为 /mnt/data/mysql1,将现有目录拷贝到目标目录cp -rp /var/lib/mysql /mnt/data/mysql2,配置 /etc/my.cnf修改里面 datadir的目录,改为现有的目录datadir=/mnt/data/mysqlsocket=/m...
2018-05-15 08:51:41
3897
转载 对方网络非正常断开检测方法
windows下此处的”非正常断开”指TCP连接不是以优雅的方式断开,如网线故障等物理链路的原因,还有突然主机断电等原因有两种方法可以检测:1.TCP连接双方定时发握手消息 2.利用TCP协议栈中的KeepAlive探测第二种方法简单可靠,只需对TCP连接两个Socket设定KeepAlive探测,所以本文只讲第二种方法在Linux,Window2000下的实现(在其它的平台上
2010-05-11 15:43:00
579
原创 网络地址转换
C++网络编程经常会涉及到类似192.168.1.218到unsigned long 的转换1,采用api处理:char szHost[20] = "192.168.1.218"; unsigned long lIP=inet_addr(szHost); in_addr in; in.S_un.S_addr=lIP; long ll=ntohl(lIP); char* chHost
2009-06-09 15:00:00
735
原创 利用脚本检查个进程是否存在
ps -C syslogd -o pid=运行这个脚本,就可以输出syslogd 的pid,把syslogd 换成你感兴趣的进程名,就能得到对应的pid
2009-06-06 09:51:00
799
转载 Linux下获取文件大小的方法
前几天在工作中需要写一段代码,获取一些视频文件的大小,心想:这还不简单吗?直接用标准C 的文件操作函数就OK了。于是写了下面的一段代码来实现:unsigned long get_file_size(const char *filename){unsigned long size;FILE* fp = fopen( filename, "rb" );if(fp==NULL)
2009-05-29 21:11:00
980
1
转载 获取字节的各个bit
printf("the value is 10000001 !/n"); unsigned char a=129; int r[8]={0}; r[0] = a & 0x01; // 最低位 r[1] = ( a & 0x02) >> 1; r[2] = ( a & 0x04) >> 2; r[3] = ( a & 0x08) >> 3; r[4] = ( a & 0x10) >>
2009-04-11 22:11:00
1232
1
转载 16进制字符串转数字(C/C++,VB/VB.net,C#)
这个问题看是很简单,但是在不同语言中实现的方式却千差万别,如果不知道方法,还真是麻烦,我就是在C#中遇到该问题,让我费了很大的周折,才在msdn查到。一、16进制字符串转数字 1、C/C++ I、最简单的办法:sscanf(“12AB”,,”%x”,&lngHex); //字符也可以为”0x12AB” II、有个朋友,自行编写函数实现了该功
2009-04-11 21:55:00
1179
转载 stl map高效遍历删除的方法
for(;iter!=mapStudent.end();){ if((iter->second)>=aa) { //满足删除条件,删除当前结点,并指向下面一个结点 mapStudent.erase(iter++); } else { //条件不满足,指向下面一个结点
2009-03-21 17:59:00
12758
1
原创 Windows下精确到微秒的系统时间获取
参考ACE的实现代码static const DWORDLONG FILETIME_to_timval_skew=116444736000000000;FILETIME tfile;::GetSystemTimeAsFileTime (&tfile);ULARGE_INTEGER _100ns;_100ns.LowPart = tfile.dwLowDateTime;_100ns.HighPa
2009-01-05 14:22:00
6723
原创 序言
已经在有些项目中用了ACE库进行编程,也许有些方面不是太满意,但可能是自己用的不太好或者没有选择最好的使用方法,不过真的很方便,下面有时间对它的实现代码进行进一步的研读,学习专家的代码也是提高自己的过程,但ACE的代码比较多,一时不知从哪里下手,以及采用什么样的方法记录下来,而且,有的类的实现考虑到各个不同的平台,实现的非常复杂,提供的接口也比较多,想来想去,还是决定从C++NP1开始,只看学习上
2009-01-03 22:27:00
666
转载 pragma指令简介
在编写程序的时候,我们经常要用到#pragma指令来设定编译器的状态或者是指示编译器完成一些特定的动作.下面介绍了一下该指令的一些常用参数,希望对大家有所帮助!一. message 参数。 message 它能够在编译信息输出窗 口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为: #pragma message(“消息文本”) 当编译器遇到这条指令时就在编
2008-12-25 15:15:00
630
转载 在控制台程序中隐藏控制台窗口!
大家都知道,当编写一个win32 console application时,当运行此类程序的时候默认情况下会有一个类似DOS窗口的console窗口,但是有的时候我们只想在程序中运行一段功能代码,不希望显示这个console窗口,让代码执行完毕之后程序自动退出.下面就介绍一下,如何隐藏win32 console application的console窗口因为此种方法是通过设置编译器的链接开
2008-12-25 15:14:00
684
转载 C++中几个比较不常用的关键字
mutable关键字关键字mutable是C++中一个不常用的关键字,他只能用于类的非静态和非常量数据成员我们知道一个对象的状态由该对象的非静态数据成员决定,所以随着数据成员的改变,对像的状态也会随之发生变化!如果一个类的成员函数被声明为const类型,表示该函数不会改变对象的状态,也就是该函数不会修改类的非静态数据成员.但是有些时候需要在该类函数中对类的数据成员进行赋值.这个时候就需要用
2008-12-25 15:13:00
630
转载 使用VMware虚拟磁盘管理工具调整磁盘大小
VMware虚拟磁盘管理工具是VMwareWorkstation软件包里的一个软件,它让你用命令行或通过脚本来创建管理修改虚拟磁盘文件。它的一个重要的特性是能够增大虚拟磁盘大小,使虚拟磁盘的最大尺寸比刚创建时(定义的)更大。它是这样一种方法,如果你需要更多的磁盘空间在已经定义的虚拟机中,而你又不想添加另外一块硬盘或者用Ghost软件来传递虚拟磁盘上的数据到另外一块更大的虚拟磁盘上去时,
2008-12-07 18:40:00
1639
转载 例解 autoconf 和 automake 生成 Makefile 文件
本文介绍了在 linux 系统中,通过 Gnu autoconf 和 automake 生成 Makefile 的方法。主要探讨了生成 Makefile 的来龙去脉及其机理,接着详细介绍了配置 Configure.in 的方法及其规则。引子无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令。不管是自己进行项目开发还是安装应用软件,我们都经常要用到
2008-11-28 00:29:00
536
转载 ACE自动生成makefile
//---------------------------------------------------------------//@file: hello.cpp#include #include "ace/Log_Msg.h"#include "ace/OS_main.h"int ACE_TMAIN(int argc, ACE_TCHAR* argv[]){
2008-11-27 22:22:00
1030
原创 TCP接受连续大数据流
最近做的一个视频数据传输项目,发现密集型的数据发送,在接收端如果仅仅只是先接收固定长度的包头数据,按照包头数据的内容,获取后续数据的长度,再进行接收,这样做在本机上运行或许没有什么问题,一旦到了网络上就不行了。可能会出现错包的情况,也就是说,你认为你接收的是包头数据,但那不是真正的包头数据,因此,你对后续数据的接收就完全错位了。解决这个办法要加强对包头数据的检测,并且要在接收的过程中进行分包和并包
2008-11-20 13:59:00
3336
转载 关于SIGPIPE导致的程序退出
收集一些网上的资料,以便参考:http://blog.chinaunix.net/u2/69143/showart_1087349.html 当服务器close一个连接时,若client端接着发数据。根据TCP协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会发出一个SIGPIPE信号给进程,告诉进程这个连接已经断开了,不要再写了。 根据信号的默认处理规则
2008-11-19 11:04:00
1870
原创 Program received signal SIGPIPE, Broken pipe
Program received signal SIGPIPE, Broken pipewhat happen?你write的fd被对方关闭了。需要如下调用避免signal(SIGPIPE, SIG_IGN);并且处理write的返回,errno=EPIPE如果使用ACE_TASK的话,可能handle_input已经接收到Client断开连接的信号,但svc中的线程可能还在向这个连接发送数据,就
2008-11-19 10:42:00
7829
1
转载 Linux下Poactor模式的高效实现
Poactor模式在Windows下利用完成端口的实现效率很高,可在Linux下的实现的效率并不高,这是因为当前LINUX并不是完成符合POSIX标准,只是部分实现,这里有家公司参照着提供了一个新的实现,很高效率http://www.terabit.com.au/solutions.php
2008-11-18 23:34:00
781
原创 再谈ACE_Singleton内存管理
几点心得:1,如果在程序中需要用到Reactor的事件分发和定时器的话,最好不要用ACE_Singleton,因为ACE_Singleton是在程序退出前将对象删除,而这个时候,可能会调用Cancel_Timer函数,而这个时候Reactor对象可能已经不存在了,再调用的话可能会出异常。这个时候还是用ACE_Unmanaged_Singleton,在程序退出的时候显式调用close2,如果在程序处
2008-11-17 00:39:00
2036
2
原创 ACE_Singleton内存管理
ACE提供了Singleton模式的TEMPLATE实现,近期项目中用了一下ACE_Singleton,一开始是照抄C++NP2中的,如,ACE_Unmanaged_Singleton TP_LOGGING_TASK;后面进入代码发现,ACE_Unmanaged_Singleton一般用在DLL中,比如在服务配置模式中使用,而在一般程序中,还是使用ACE_Singleton,定义如下:templa
2008-11-16 20:19:00
2286
转载 网络服务器软件开发
http://www.cppblog.com/true/default.html?page=8发现一个不错的BLOG,还不知道作者的姓名,呵呵摘要 编写连接数巨大的高负载服务器程序时,经典的多线程模式和select模式都不再适用。 应当抛弃它们,采用epoll/kqueue/dev_poll来捕获I/O事件。最后简要介绍了AIO。 由来 网络服务在处理数以万计的客户端连接时,往往出现效率低下甚至完
2008-11-16 18:23:00
755
转载 在ACE中使用epoll[zhuan]
很显然,文章的标题决定了我们是在linux下使用ACE。我们知道ACE在linux下缺省是用select来实现Reactor的,epoll相对于select的好处这里就不再啰嗦了,我们直接讲操作步骤: 第一:重新编译ACE库 ACE库中通过ACE_Dev_Poll_Reactor类来支持epoll,但是ACE库缺省的安装是没有编译这个类的,我们要做的就是将ACE_Dev_P
2008-11-16 18:19:00
632
转载 开源日志系统 - log4cplus (七)
经过短暂的熟悉过程,log4cplus已经被成功应用到了我的项目中去了,效果还不错,:)除了上文提及的功能之外,下面将介绍log4cplus提供的线程和套接字的使用情况。### NDC ###首先我们先了解一下log4cplus中嵌入诊断上下文(Nested Diagnostic Context),即NDC。对log系统而言,当输入源可能不止一个,而只有一个输出时,往往需要分辩所要输出消息的来源,
2008-11-14 23:54:00
632
转载 开源日志系统 - log4cplus (六)
log4cplus在很多方面做的都很出色,但是使用过程有些地方感觉不爽。在继续吹捧之前我先把不爽之处稍微提一提,然后继续介绍关于线程和套接字的知识。### 一些可以改进之处 ###1. 用户自定义LogLevel的实现机制不够开放在第五篇中曾经介绍过如何实现用户自行定义LogLevel,为了实现比较理想的效果,甚至还需要改log4cplus的源代码。:(2. 生成Logge
2008-11-14 23:53:00
601
转载 开源日志系统 - log4cplus (四)
将log信息记录到文件应该说是日志系统的一个基本功能,log4cplus在此基础上,提供了更多的功能,可以按照你预先设定的大小来决定是否转储,当超过该大小,后续log信息会另存到新文件中,依次类推;或者按照日期来决定是否转储。本文将详细介绍这些用法。 ### 如何将log记录到文件 ###我们在例5中给出了一个将log记录到文件的例子,用的是FileAppender类实现的,lo
2008-11-14 23:52:00
848
转载 开源日志系统 - log4cplus (五)
日志系统的另一个基本功能就是能够让使用者按照自己的意愿来控制什么时候,哪些log信息可以输出。如果能够让用户在任意时刻设置允许输出的LogLevel的信息就好了,log4cplus通过LogLevelManager、LogLog、Filter三种方式实现了上述功能。 ### 优先级控制 ###在研究LogLevelManager之前,首先介绍一下log4cplus中logger的存储机制,在
2008-11-14 23:52:00
636
转载 开源日志系统 - log4cplus (二)
本文介绍了使用log4cplus有六个步骤,并提供了一些例子引导你了解log4cplus的基本使用。### 基本使用 ###使用log4cplus有六个基本步骤:1. 实例化一个appender对象2. 实例化一个layout对象3. 将layout对象绑定(attach)到appender对象4. 实例化一个logger对象,调用静态函数:log4cplus::Log
2008-11-14 23:51:00
535
转载 开源日志系统 - log4cplus (三)
本文介绍了三种控制输出格式的布局管理器的概念和使用情况,通过掌握这些知识,可以更有效地控制log系统输出尽可能贴近你需求的信息来。 ### 如何控制输出消息的格式 ###前面已经讲过,log4cplus通过布局器(Layouts)来控制输出的格式,log4cplus提供了三种类型的Layouts,分别是SimpleLayout、PatternLayout、和TTCCLayout。其中:1.
2008-11-14 23:51:00
572
转载 开源日志系统 - log4cplus (一)
log4cplus是C++编写的开源的日志系统,功能非常全面,用到自己开发的工程中会比较专业的。本文介绍了log4cplus基本概念,以及如何安装,配置。 ### 简介 ###log4cplus是C++编写的开源的日志系统,前身是java编写的log4j系统.受Apache Software License保护。作者是Tad E. Smith。log4cplus具有线程安全
2008-11-14 23:50:00
633
原创 VC2005设置Debug内存泄露检查
在程序的主入口加入如下代码 int nFlag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); nFlag |= _CRTDBG_LEAK_CHECK_DF; _CrtSetDbgFlag(nFlag); 则将在Debug运行结束的时候,进行内存泄露检查
2008-11-14 23:49:00
1666
1
转载 TinyXML简单应用
目前虽然还不支持/CONFIG/****等多层次的直接检索,但优点是简单方便,不需要学习复杂的SDK,示例代码如下: #ifndef _CONFIG#define _CONFIG #include string>#include "tinyxml.h" using namespace std; class CConfig{public: explicit CConfig(const
2008-11-14 23:48:00
614
转载 C#中对 XML节点进行添加,删除,查找和删除操作
从网上整理所得XMLDocument来操作XML比较简单,虽然有时效率不是很高。代码如下已知有一个XML文件(bookstore.xml)如下:<?xml version="1.0" encoding="gb2312"?> <book genre="fantasy" ISBN="2-3631-4"> Oberons Legacy Corets, Eva
2008-11-14 23:47:00
3055
原创 Implementation Repository测试说明
TAO自带的一个例子程序中的说明有点小问题,写的不是很全,按照上面的步骤做了以后还是不能运行。结合STONE的说明,再根据里面的其它说明,作个补充性的描述:1,implrepo_service -orbendpoint iiop://localhost:9000 -d 1 -m 1 -p 1 -o implrepo.ior(同STONE的描述)2,imr_activator -d 1
2008-11-14 23:46:00
664
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人