C&C++
文章平均质量分 81
yine
在通信领域深耕16+年,精通C/C++/Java/Go/lua/py等编程语言,精通各类运营商协议如:SIP/T1/E1/PRI/H.323/SMGP/CMPP/SGIP/CNGP等,精通开源通信框架如:FreeSWITCH/Asterisk/Kamailio/OpenSIPS/WebRTC/JsSIP的配置使用及模块扩展及源码修改,掌握VoIP领域的音视频编解码,压缩算法,PLC,FEC,NACK等丢包补偿技术,ICE技术,QoS技术等,掌握主流模拟及数字中继网关配置接入,掌握主流微服务,存储引擎、搜索引擎、分布式、并行计算等框架,曾从事IM核心系统、消息推送平台、VoIP媒体交换平台...
展开
-
SIP 定时器 总结
SIP 定时器的总结定时器缺省值节含义T1500 ms17.1.1.1经历来回时间(RTT)T24 秒17.1.2.2非 INVITE 请求和 INVITE 响应的最长重新传输时间间隔T45 秒17.1.2.2消息可保留在网络中的最长持续时间计时器 A最初为 T117.1.1.2INVITE 请求重新传输时间间隔(仅适用于 UDP)计时器 B64*T117.1.1.2INVITE 事务超时计时器...转载 2018-05-14 17:57:06 · 3071 阅读 · 2 评论 -
C++11 理解 (十九) 之 使用或禁用对象的默认函数
在传统C++中,若用户没有提供, 则编译器会自动为对象生成默认构造函数(default constructor)、 复制构造函数(copy constructor),赋值运算符(copy assignment operator operator=) 以及析构式(destructor)。另外,C++也为所有的类定义了数个全局运算符(如operator delete及operator new)。当原创 2013-08-23 16:10:40 · 1678 阅读 · 1 评论 -
C++11 理解 (二十二) 之 正则表达式
过去许多或多或少标准化的程序库被创建用来处理正则表达式。有鉴于这些算法的使用非常普遍,因此标准程序库将会包含他们,并使用各种面向对象语言的潜力。这个新的程序库,被定义于头文件,由几个新的类型所组成:正则表达式(样式)以样板类 basic_regex 的实体表示样式匹配的情况以样板类 match_results 的实体表示函数 regex_search 是用来搜索样式; 若要原创 2013-08-26 11:19:37 · 3707 阅读 · 0 评论 -
C++11 理解 (二十四) 之 可扩展的随机数功能
C 标准库允许使用rand函数来生成伪随机数。不过其算法则取决于各程序库开发者。 C++ 直接从 C 继承了这部份,但是 C++11 将会提供产生伪乱数的新方法。C++11 的随机数功能分为两部分: 第一,一个乱数生成引擎,其中包含该生成引擎的状态,用来产生乱数。第二,一个分布,这可以用来决定产生乱数的范围,也可以决定以何种分布方式产生乱数。乱数生成对象即是由乱数生成引擎和分布所构成。原创 2013-08-26 14:42:57 · 737 阅读 · 0 评论 -
C++11 理解 (二十七) 之 用于元编程的类别属性
对于那些能自行创建或修改本身或其它程序的程序,我们称之为元编程。这种行为可以发生在编译或运行期。C++ 标准委员会已经决定引进一组由模板实现的库,程序员可利用此一库于编译期进行元编程。底下是一个以元编程来计算指数的例子:templateint B, int N>struct Pow { // recursive call and recombination.原创 2013-08-26 15:34:38 · 755 阅读 · 0 评论 -
C++11 理解 (二十八) 之 用于计算函数对象返回类型的统一方法
要在编译期决定一个样板仿函数的回返值类别并不容易,特别是当回返值依赖于函数的参数时。举例来说:struct Clear { int operator()(int); // 參數與回返值的型別相同 double operator()(double); // 參數與回返值的型別相同}; template class Obj> class Calcul原创 2013-08-26 16:53:51 · 722 阅读 · 0 评论 -
C++11 理解 (二十五) 之 包装引用
我们可以通过实体化样板类 reference_wrapper 得到一个包装引用 (wrapper reference)。包装引用类似于一般的引用。对于任意对象,我们可以通过模板类 ref 得到一个包装引用 (至于 constant reference 则可通过 cref 得到)。当样板函数需要形参的引用而非其拷贝,这时包装引用就能派上用场:// 此函數將得到形參 'r' 的原创 2013-08-26 14:45:31 · 1196 阅读 · 0 评论 -
C++11 理解 (二十三) 之 通用智能指针
这些指针是由 TR1 智能指针演变而来。注意! 智能指针是类型而非一般指针。shared_ptr 是一引用计数 (reference-counted) 指针,其行为与一般 C++ 指针即为相似。在 TR1 的实现中,缺少了一些一般指针所拥有的特色,像是别名或是指针运算。C++11新增前述特色。一个 shared_ptr 只有在已经没有任何其它 shared_ptr 指向其原本所指向原创 2013-08-26 11:23:09 · 881 阅读 · 0 评论 -
C++11 理解 (二十六) 之 多态函数对象包装器
针对函数对象的多态包装器(又称多态函数对象包装器)在语义和语法上和函数指针相似,但不像函数指针那么狭隘。只要能被调用,且其参数能与包装器兼容的都能以多态函数对象包装器称之(函数指针,成员函数指针或仿函数)。通过以下例子,我们可以了解多态函数对象包装器的特性:std::functionint (int, int)> func; // 利用樣板類 'function'原创 2013-08-26 14:47:51 · 1089 阅读 · 0 评论 -
C++11 理解 (二十一) 之 散列表
在过去,不断有要求想将散列表(无序关系式容器)引进标准库。只因为时间上的限制,散列表才没有被标准库所采纳。虽然,散列表在最糟情况下(如果出现许多冲突 (collision) 的话)在性能上比不过平衡树。但实际运用上,散列表的表现则较佳。因为标准委员会还看不到有任何机会能将开放寻址法标准化,所以目前冲突仅能通过链地址法 (linear chaining) 的方式处理。为避免与第三方库发展的散原创 2013-08-23 16:38:47 · 1049 阅读 · 0 评论 -
C++11 理解 (二十) 之 多元组类别
多元组是一个内由数个异质对象以特定顺序排列而成的数据结构。多元组可被视为是 struct 其数据成员的一般化。由 TR1 演进而来的 C++11 多元组类别将受益于 C++11 某些特色像是变长参数模板。TR1 版本的多元组类别对所能容纳的对象个数会因实现而有所限制,且实现上需要用到大量的宏技巧。相反的,C++11 版本的多元组型基本上于对其能容纳的对象个数没有限制。然而,编译器对于模原创 2013-08-23 16:35:23 · 1646 阅读 · 0 评论 -
C++11 理解 (十一) 之 空指针
早在 1972 年,C语言诞生的初期,常数 0 带有常数及空指针的双重身分。 C 使用 preprocessor macro NULL 表示空指针, 让 NULL 及 0 分别代表空指针及常数 0。 NULL 可被定义为 ((void*)0) 或是 0。C++ 并不采用 C 的规则,不允许将 void* 隐式转换为其他类型的指针。 为了使代码 char* c = NULL; 能通过编译原创 2013-08-23 09:51:46 · 985 阅读 · 0 评论 -
C++11 理解 (十二) 之 强类型枚举
在标准C++中,枚举类型不是类型安全的。枚举类型被视为整数,这使得两种不同的枚举类型之间可以进行比较。C++03 唯一提供的安全机制是一个整数或一个枚举型值不能隐式转换到另一个枚举别型。 此外,枚举所使用整数类型及其大小都由实现方法定义,皆无法明确指定。 最后,枚举的名称全数暴露于一般范围中,因此两个不同的枚举,不可以有相同的枚举名。 (好比 enum Side{ Right, Left }; 和原创 2013-08-23 11:03:00 · 1224 阅读 · 0 评论 -
C++11 理解 (十三) 之 角括号
标准 C++ 的剖析器一律将 ">>" 视为右移运算符。 但在样板定义式中,绝大多数的场合其实都代表两个连续右角括号。 为了避免剖析器误判,撰码时不能把右角括号连着写。C++11 变更了剖析器的解读规则;当遇到连续的右角括号时,优先解析右角括号为样板引数的退出符号。 如果解读过程中出现普通括号("(" 与 ")"),这条规则产生变化:templatebool bTest> So原创 2013-08-23 11:07:55 · 9086 阅读 · 0 评论 -
C++11 理解 (十五) 之 模板的别名
在进入这个主题之前,各位应该先弄清楚“模板”和“类型”本质上的不同。class template (类型模板,是模板)是用来产生 template class (模板类型,是类型)。在标准 C++,typedef 可定义模板类型一个新的类型名称,但是不能够使用 typedef 来定义模板的别名。举例来说:template typename first, typename secon原创 2013-08-23 11:25:39 · 5956 阅读 · 0 评论 -
C++11 理解 (十四) 之 显式类型转换子
C++ 为了避免用户自定的单引数建构式被当成隐式类型转换子,引入了关键字 explicit 修饰字。 但是,在编译器对对象调用隐式类型转换的部分,则没有任何着墨。 比方说,一个 smart pointer 类型具有一个operator bool(), 被定义成若该 smart pointer 保管任何资源或指针,则传回 true,反之传回 false。 遇到这样的代码时:if(smart_pt原创 2013-08-23 11:18:24 · 1221 阅读 · 0 评论 -
C++11 理解 (十六) 之 无限制的unions
在标准 C++ 中,并非任意的类型都能做为 union 的成员。比方说,带有 non-trivial 构造函数的类型就不能是 union 的成员。在新的标准里,移除了所有对 union 的使用限制,除了其成员仍然不能是引用类型。 这一改变使得 union 更强大,更有用,也易于使用。[1]以下为 C++11 中 union 使用的简单样例:struct point{ po原创 2013-08-23 15:01:18 · 1819 阅读 · 0 评论 -
C++11 理解 (十七) 之 变长参数模板
在 C++11 之前, 不论是类模板或是函数模板,都只能按其被声明时所指定的样子,接受一组固定数目的模板参数 ; C++11 加入新的表示法,允许任意个数、任意类别的模板参数,不必在定义时将参数的个数固定。templatetypename... Values> class tuple;模板类 tuple 的对象,能接受不限个数的 typename 作为它的模板形参:原创 2013-08-23 15:57:04 · 3133 阅读 · 0 评论 -
C++11 理解 (十八) 之 字串字面值
标准C++提供了两种字符串字面值。第一种,包含有双引号,产生以空字符结尾的const char数组。第二种有着前标L,产生以空字符结尾的const wchar_t数组,其中wchar_t代表宽字符。对于Unicode编码的支持尚付阙如。为了加强C++编译器对Unicode的支持,类别char的定义被修改为其大小至少能够存储UTF-8的8位编码,并且能够容纳编译器的基本字符集的任何成员。原创 2013-08-23 16:07:03 · 3194 阅读 · 0 评论 -
freeswitch离线对帐话单的产生及保存方式及配置说明
--> --> --> INSERT INTO cdr VALUES ("${caller_id_name}","${caller_id_number}","${destination_number}","${context}","${start_stamp}","${answer_s原创 2014-07-28 10:17:10 · 5290 阅读 · 0 评论 -
FreeSWITCH初识
读到本章,你应该对 FreeSWITCH 有了一个比较全面的了解,迫切地想实验它强大的功能了。让我们从最初的运行开始,一步一步进入 FreeSWITCH 的神秘世界。命令行参数一般来说,FreeSWITCH 不需要任何命令行参数就可以启动,但在某些情况下,你需要以一些特殊的参数启动。在此,仅作简单介绍。如果你知道是什么意思,那么你就可以使用,如果不知道,多半你用不到。使用转载 2015-07-28 12:15:56 · 6605 阅读 · 0 评论 -
软交换FreeSWITCH系统概要和源代码分析预备知识
asterisk与freeswitch的比较:1:Asterisk是针对1百人以下的小型系统,相同的硬件配置下单系统最多并发200路,而根据国外爱好者测试freeswitch可达到2000-3000路sip通道(媒体流并发)。2:Asterisk用动态链表来管理每个打开的通道,这样在多线程中非常难于管理(需要频繁的锁定和解锁)。而freeswitch每个呼叫通道都会用一个线程来管理呼叫状态原创 2015-07-28 16:35:16 · 1424 阅读 · 0 评论 -
freeswitch源码阅读 之 sofia模块
sofia模块在freeswitch中的位置非常重要, 所有的sip通话都和它有关, 那么原创 2014-07-25 12:01:12 · 6401 阅读 · 0 评论 -
高性能stun服务器搭建
项目中使用WebRtc,需要使用stun服务器,网上倒是共享了许多免费可用的stun服务地址,但是稳定性无法保障,所以提前预研了一下; 使用Stuntman搭建,地址:http://www.stunprotocol.org/搭建过程该项目的github上也是有的在这简单阐述一下:首先:[javascript] view plain copy原创 2017-09-05 11:31:49 · 3769 阅读 · 4 评论 -
FreeSWITCH源码分析之mod_xml_curl
近期又开始了我的FreeSWITCH研究之路, 因为项目中需要, 使用sip_profile中的internal端点来处理sipUA的注册及在线保持做被叫, 打开了登录及呼叫认证的开关, 我们都知道FreeSWITCH默认的directory中有1000-1019这20个默认用户, 如果新增用户也有一个批处理脚本能快速的生成出来新的用户, 但是我们做为一个统一平台的操作, 有一个分布式的FS集群原创 2017-06-20 20:24:35 · 3128 阅读 · 1 评论 -
VS2017下编译和配置boost库及安装OpenSSL
第一步:到官网http://www.boost.org/下载boost库,最好下载1.6x最新版第二步:解压。可解压到固定的目录,我是解压到E:\mylib\boost第三步:环境配置VS2017更加注重跨平台性,安装文件较多,VC有三个版本,分别是arm、Hostx64、Hostx86,本文使用Hostx64。注意,需要使用cl.exe. 默认安装时,编译器cl.exe并不在环境变量中,需要配置...原创 2018-03-19 12:44:05 · 2324 阅读 · 0 评论 -
FreeSWITCH线上一次Crashes分析定位过程-ldns库问题
FS线上一次Crashes分析定位过程-ldns库问题– by yine 2018-04-10 15:33:05一、故障发生时间点2018-04-10 09:54:07二、堆栈查看结果warning: .dynamic section for "/usr/lib/x86_64-linux-gnu/librtmp.so.1" is not at the expected address (wrong...原创 2018-04-10 16:01:06 · 2751 阅读 · 3 评论 -
Linux上编译及安装boost库及websocket++使用
一、先下载boost源码, 截止当前最新稳定版wget https://dl.bintray.com/boostorg/release/1.66.0/source/boost_1_66_0.tar.gz二、编译,有时线上机器无root权限,只能安装到自己的目录下./bootstrap.sh --prefix=/root/yine/lib/boost/install --libdir=/root/y...原创 2018-03-28 16:23:01 · 2610 阅读 · 0 评论 -
FreeSWITCH中DESTINATION_OUT_OF_ORDER原因分析
问题:在话单中会产生DESTINATION_OUT_OF_ORDER这种挂断原因, 但是A, B leg都有通话时长, 但是貌似时长都比较短, 不知道这个会引起什么问题, 在FS里是正常还是异常的?产生过程:先originate Aleg, park住, 再originate Bleg, 当B按听后, 再将ABLeg桥接, uuid_bridge auuid, buuid , 这样会有一定小概率的...原创 2018-04-20 15:32:56 · 10912 阅读 · 1 评论 -
FreeSWITCH代码分析
什么是FreeSWITCHFreeSWITCH 是一个可扩展的开源跨平台的电话平台,支持音频、视频、文本或任何其他形式的媒体使用的协议的路由与交互。它于2006年成立。FreeSWITCH也提供一个稳定的技术平台,可供许多电话应用开发利用的免费工具。FreeSWITCH 最初由Anthony Minessale在Brian West和Michael Jerris的协助下设计和开发。原创 2015-07-28 16:41:13 · 2321 阅读 · 0 评论 -
FreeSWITCH落地的配置总结
[+]简介首先先说明一下落地的含义。用我简单粗糙的理解,就是通过SIP接入运营商呼到手机或者固话。在FreeSWITCH中使用SIP和运营商对接达到落地的效果。对接方式简单介绍一下,FreeSWITCH里Gateway(网关)的概念。网关又成协议转换器,通常都是进行协议转换。这里说的网关指的是语音网关,如常用的SIP网关,负责SIP协议和七号信令或ISDN原创 2017-05-18 10:06:27 · 1589 阅读 · 0 评论 -
FreeSWITCH呼叫保持思路
场景介绍该篇文章主要用于介绍如何使用FreeSWITCH实现通讯系统中常见的多人来电功能。 具体场景如下: A与B正在通话中,此时C拨打A/B,FreeSWITCH发送消息给A/B提示有新电话进来,A/B收到提示后,可以选择不予理睬或者保持当前通话接通C。在与C通话完毕后,在还没挂断的情况下,可以继续返回与B/A继续通话。设置拨号方案在文件/usr/local/fr转载 2015-07-28 12:29:13 · 4134 阅读 · 2 评论 -
rtpengine源码结构分析及交互流程
一、交互结构图二、总体结构:1. 大部分数据结构都直接使用的glib的库提供的;2. 将网络层做了一个封装和业务部分用回调方法来解偶;3. 和第三方服务用网络TCP/UDP连接方式用简单自定义文本协议来交互;4. 可以将相关的状态同步给redis外部缓存, 供其它外界的分析调用;5. 采用内核相关模块来进行媒体的交换, 提高应用性能。三、流程分析原创 2015-07-28 10:17:37 · 4743 阅读 · 2 评论 -
freeswitch的优势
Asterisk 与freeswitch都是流行的开源软交换服务器,Asterisk出现的比较早,大概在1999年开始此项目,应该是最流行的开源软交换服务器,整个社区上下游都已经很成熟。freeswitch 算是后起之秀,2005年才开始,但性能和稳定性都明显优于Asterisk,但由于出现的 晚,导致其功能的多样性及与其他系统的集成难度高于asterisk.下面为As转载 2015-07-28 12:14:14 · 2584 阅读 · 0 评论 -
FreeSwitch下配置DID的方法
首先介绍下什么是DID? 翻译为中文为“直接向内拨号”,该服务是由电话公司提供的,它使用户能够直接拨打PBX或VOIP系统中的分机号码,而无需求助于总机或自动话务系统。现在要实现这样一个功能 - 通过手机或座机拨打一个号码(例如:01088888888),可以直接联系到VOIP系统(FreeSwitch系统)的1008这个用户。如下图所示:手机/座机 ---------------转载 2015-07-28 16:28:09 · 3505 阅读 · 1 评论 -
性能测试工具
压力测试工具Grinder:http://grinder.sourceforge.net/PTP自动化性能测试平台: http://perf.hz.netease.com/Jmeter: http://jmeter.apache.org/Gatling: http://www.infoq.com/cn/articles/new-generation-server-testing转载 2015-08-26 11:29:18 · 6812 阅读 · 0 评论 -
SIP: From ,Contact, Via 和 Record-Route/Route head字段详解
本文对SIP 消息中from, contact, via, record-route 和route 字段进行详细的解释,便于大家对SIP信令进行分析和排错From: 如果一个SIP消息中没有Contact或者Record-Route头域,那么callee就会根据From头域产生后续的Request。比如:如果 Alice打一个电话给Bob,From头域的内容是 From:Alice转载 2017-04-25 11:42:41 · 6642 阅读 · 0 评论 -
zookeeper原理
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等。Zookeeper是hadoop的一个子项目,其发展历程无需赘述。在分布式应用中,由于工程师不能很好地使用锁机制,以及基于消息的协调机制不适合在某些应用中使用,因此需要有一种可靠的、可扩展的、分布式的、可配置的协调机制来统一系统的状态。Zookee转载 2017-04-26 11:18:36 · 534 阅读 · 0 评论 -
FreeSWITCH源码分析之主函数main()
Freeswitch的主函数是在文件switch.c中定义的,该文件的260行是整个程序的入口,主函数主要完成的功能是包括,命令行解析,初始化apr库,构建全局内存池,模块加载和初始化核心组件。 初始化apr库是由apr_initialize()函数完成的,apr库是apache的可移植动态库,完成相关的内存池,线程管理的跨平台工作。该函数的调用在主函数的659行。745行的原创 2017-08-21 16:19:54 · 2245 阅读 · 2 评论 -
C++11 理解 (十) 之 显式虚函数重载
在 C++ 里,在子类中容易意外的重载虚函数。举例来说:struct Base { virtual void some_func();}; struct Derived : Base { void some_func();};Derived::some_func 的真实意图为何? 程序员真的试图重载该虚函数,或这只是意外? 这也可能是 base原创 2013-08-23 09:45:44 · 872 阅读 · 0 评论