
技术-C++
文章平均质量分 79
求真得真
空空如常,求真得真
展开
-
DTMF从2833到inband的方案
freeswitch是一款简单好用的VOIP开源软交换平台。之前的文章中介绍过通过dialplan拨号计划配置的方法,实现2833到inband的转换,但是实际生产环境中的场景会更复杂,无法预先在dialplan中设置好相关参数和函数。根据sip协议的规范,在媒体协商的过程中,如果已经有183SDP或update的SDP了,则200SDP会被忽略。原创 2025-03-28 17:54:01 · 900 阅读 · 0 评论 -
spandsp_start_dtmf的bug及修复
freeswitch是一款简单好用的VOIP开源软交换平台。之前的文章中介绍过DTMF从2833到inband的转换,其中inband到2833的转换使用了“spandsp_start_dtmf”,这个函数在转换的过程中有缺陷。因为需要对inband的媒体流做缓存,所以该处理会产生40ms左右的语音时延。空空如常求真得真。原创 2025-01-23 17:53:52 · 730 阅读 · 0 评论 -
获取当天剩余时间
业务测试的过程中,本来有一个时间函数“获取当天剩余时间”,其中使用了localtime()和mktime(),但是在压力测试的过程中发现,两个time函数都不是线程安全的,多线程并发的时候会产生一些随机的错误,结果就是获得的interval时间错误,进而影响到业务流程。fs是多线程架构,对于大并发场景下的压力测试要特别注意线程安全的问题。为了尽可能的提高性能,也有很多技术手段可以不使用加锁的方式解决。空空如常求真得真。原创 2024-02-23 17:45:31 · 318 阅读 · 0 评论 -
如何最快找出复杂代码运行时的函数调用流程
最近在使用freeswitch测试发送DTMF码的时候,碰到一个函数调用流程的问题。fs本身的模块较多,注册回调函数也比较多且复杂,有时候看到一条日志,却不知道流程的发起端在哪里。通常我们在梳理代码调用流程的时候有几种方法。1,梳理源代码流程,代码太复杂的时候效果差。2,在调用函数中打印日志,代码太复杂的时候效果差。3,通过backtrace函数追踪当前堆栈,改动多,细节多。4,gdb调试,命令复杂难记。https。...原创 2022-07-21 18:01:32 · 496 阅读 · 0 评论 -
gitlab安装,移库,升级
概述最近因为机房原因,需要把我们的本地代码库做移库操作。针对gitlab的安装升级操作重新进行了梳理,记录一下。环境CENTOS6CENTOS7gitlab-ce-8.14.2GITLAB安装方法1,下载rpm包安装。wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-8.14.2-ce.0.el7.x86_64.rpmsudo yum install git...原创 2022-05-05 17:03:10 · 518 阅读 · 0 评论 -
centos6的yum源更新版本
概述centos6系统从2020年12月1号开始不再维护,官方的yum源不再可用,同时国内的阿里云镜像和163镜像也都不再可用。但是我们有一些老的服务器仍然在使用centos6系统版本,依赖库的安装和更新就有了问题。有问题就有需求,有需求就有解决方案。yum源在之前的老文章中,我们发过一个版本的yum源设置,其中使用了centos官方的vault源。Vault源也是centos的官方源,vault源主要用作保存老版本的快照,文件树中有centos各个版本的快照记录,仅提供对...原创 2022-04-06 19:02:22 · 877 阅读 · 3 评论 -
freeswitch 新通话启动过程梳理
概述freeswitch是一款开源的VOIP软交换平台,功能强大。在使用fs进行呼叫业务的过程中,我们最常见到的日志就是呼叫通道的启动信息,日志如下2022-03-03 14:14:30.028832 [NOTICE] switch_channel.c:1133 New Channel sofia/internal/1001@192.168.0.152 [d70acc45-294c-4787-8dce-ff46d2cd96a1]这行日志表示一个新的通话channel初始化完成。...原创 2022-03-24 09:11:08 · 759 阅读 · 0 评论 -
freeswitch的任务引擎实现分析
概述freeswitch核心框架中有一个定时任务系统,在开发过程中用来做一些延时操作和异步操作很方便。我们在VOIP的呼叫流程中,经常会有一些对实时性要求没那么高的操作,或者会有阻塞流程的操作,我们都可以开启一个定时任务子流程,来达到延时和异步的目标。下面,我们来对这个任务引擎的代码实现做一个简单的梳理和分析。环境centos:CentOS release 7.0 (Final)或以上版本freeswitch:v1.8.7GCC:4.8.5数据结构源码...原创 2022-03-02 17:59:55 · 514 阅读 · 0 评论 -
freeswitch的事件引擎实现分析
概述freeswitch是由事件驱动的,fs内部有各种事件来标识状态的变化包括呼叫的变化、配置的变化、号码的变化等等。而一个框架内的事件引擎需要实现哪些基本的功能呢?让我们来看一下fs的事件引擎是如何实现的。环境centos:CentOS release 7.0 (Final)或以上版本freeswitch:v1.8.7GCC:4.8.5数据结构fs中event事件的实现主要在以下俩个文件。src\include\switch_event.hs...原创 2022-02-16 17:52:02 · 832 阅读 · 0 评论 -
freeswitch插件式模块接口实现方式
概述freeswitch的外围模块是插件式的,可以动态的加载和卸载,使用起来非常的灵活和方便。如果我们自己来设计一个开源的代码框架,相信这种插件式的模块结构是非常适合多人合作的模式。本文对fs的模块加载接口进行一些分析和讨论,作为借鉴。环境centos:CentOS release 7.0 (Final)或以上版本freeswitch:v1.8.7GCC:4.8.5模块接口freeswitch新增mod_task模块的介绍,见之前的文章。在mod_...原创 2022-02-09 17:53:14 · 715 阅读 · 0 评论 -
freeswitch APR-UTIL库线程池实现分析
概述freeswitch的核心源代码是基于apr库开发的,在不同的系统上有很好的移植性。APR库在之前的文章中已经介绍过了,APR-UTIL库是和APR并列的工具库,它们都是由APACHE开源出来的跨平台可移植库,不同点在于库中实现的功能接口有区别。在应用的开发过程中,多线程并发是提高效率的常用方案,但是多线程管理并不好做。在很多大型应用中,都会引入线程池的框架。线程池是一个线程集合,有统一的管理,当有一个新的任务下发,线程池管理会按照一定的策略将任务分配给空闲的线程。当任务积压较...原创 2021-12-30 11:39:12 · 510 阅读 · 0 评论 -
freeswitch APR-UTIL库消息队列实现
概述freeswitch的核心源代码是基于apr库开发的,在不同的系统上有很好的移植性。APR库在之前的文章中已经介绍过了,APR-UTIL库是和APR并列的工具库,它们都是由APACHE开源出来的跨平台可移植库,不同点在于库中实现的功能接口有区别。在应用的开发过程中,模块内部的消息传递是经常会碰到的需求,而消息队列就是很好的解决方案。APR-UTIL库中就提供了一套线程安全的消息队列接口。我对几个问题比较好奇,消息队列的数据结构是什么样的?消息队列如何插入元素?消息队列如何弹...原创 2021-12-22 09:23:58 · 328 阅读 · 0 评论 -
状态机的状态迁移表写法
概述VOIP服务器中,对于一通呼叫的管理一定会涉及到呼叫状态的变化,包括初始化、呼叫发起、振铃、接通、结束等各种状态。呼叫业务流程为了管理呼叫状态的变化,就要用到有限状态机这一概念。最简单的状态机实现,就是if-else或者switch分支方法。当状态机的状态变化比较简单明了时,条件分支的写法就很好用,但是在条件和状态越来越复杂的情况下,就需要用到状态迁移表的写法,对于整体的状态变迁更容易扩展、维护和理解。本文根据一个实际的呼叫业务需求,使用状态迁移表实现状态机的业务逻辑。...原创 2021-12-15 14:28:12 · 2159 阅读 · 0 评论 -
freeswitch APR库线程读写锁
概述freeswitch的核心源代码是基于apr库开发的,在不同的系统上有很好的移植性。线程读写锁在多线程服务中有重要的作用。对于读数据比写数据频繁的服务,用读写锁代替互斥锁可以提高效率。由于APR库是跨平台的,而不同平台上的系统接口有区别,所以在APR库中就有一个适配层目录libs\apr\include\arch\,该目录下有不同系统的头文件定义,包括aix、beos、netware、os2、os390、unix、win32。在编译源代码文件的过程中,根据当前系统自动选择不同的...原创 2021-12-09 19:53:38 · 378 阅读 · 0 评论 -
freeswitch APR库内存池
概述freeswitch的核心源代码是基于apr库开发的,在不同的系统上有很好的移植性。apr库中的大部分API都需要依赖于内存池,使用内存池简化内存管理,提高内存分配效率,减少内存操作中出错的概率。在fs的自定义模块开发中,我们也会用到内存池来操作内存,所以要对内存池的基本操作和使用限制有一定了解,防止错误的使用,导致程序运行问题。下面我们对apr的内存池接口做一个介绍。环境centos:CentOS release 7.0 (Final)或以上版本free...原创 2021-11-17 20:04:21 · 583 阅读 · 0 评论 -
freeswitch APR库
概述freeswitch依赖库源代码基本都可以在libs目录下找到。在freeswitch的官方手册中,可以找到freeswitch的依赖库表格,其中freeswitch的core核心代码依赖库主要包括apr、apr-util、pcre、resample、sqlite、srtp、teletone等。其中,apr库和apr-util库是freeswitch最重要的依赖库,可以说fs就是在apr库的基础上搭建起来的。apr库的全称是Apache Portable Runtime Projec..原创 2021-11-10 14:33:31 · 466 阅读 · 0 评论 -
epoll实现快速ping
概述在VOIP的运营过程中,最常见的一类问题就是语音质量问题,网络间的丢包、延迟、抖动都会造成语音质量的体验下降。当现网出现语音质量问题的时候,我们有没有工具能够快速的界定问题的边界,缩小排查的范围,是运营过程中的重要环节。ping是我们查看网络状况最常用的工具,简单好用,但是也有很多限制,比如发包间隔等。VOIP常见的媒体格式G711的发包间隔为20ms,单包大小在210字节左右.作为C/C++开发,epoll也是我们必点的技能点。所以,干脆自己用epoll开发一个没有限制的p..原创 2021-10-20 14:31:32 · 451 阅读 · 0 评论 -
函数调用关系图
概述在对源代码走读的过程中,我们可以借助一些工具来帮助理解源代码的结构和函数调用关系,比如生成函数调用关系图。cflow工具通过分析一组C源文件,绘制出程序的逻辑流程图和交叉引用列表,在此分析结果的基础上,通过其他工具生成可视化的图像文件,帮助我们理解源代码。环境centos:CentOS release 7.0 (Final)或以上版本freeswitch:v1.8.7GCC:4.8.5工具安装cflow安装wget https://ftp.gnu.org/原创 2021-09-10 14:49:06 · 6734 阅读 · 0 评论