![](https://img-blog.csdnimg.cn/20190927151101105.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
pjlib
pjproject的基础项目
HYQ458941968
这个作者很懒,什么都没留下…
展开
-
pjproject开篇
在voip行业多年,知道很多优秀的库,pjproject精致轻量,是一个入门级的学习素材。为了记录自己的学习成果,准备写一系列关于pjproject的相关博客。pjproject的官方地址是pjproject官方网站概述PJSIP 开源库由一系列功能库所组成:PJLIB 是系统抽象层 PPJLIB-UTIL 提供有用的工具函数 PJNATH 解决NAT 穿越问题 P...原创 2019-08-24 20:31:01 · 1277 阅读 · 0 评论 -
pjlib系列开篇
PJLIB是pj项目中最底层的库,也许你不想用pjsip,想使用exosip;不想使用pjmedia,想使用webrtc,但是pjlib作为公共库还是一个不错的选择。PJLIB提供的特性,先翻译一下官方文档的描述,此翻译来源于网友pjlib官方文档1).非动态内存分配[No Dynamic Memory Allocations]实现了内存池,获取内存是从与分配的内存池中获取,高性能程序多会自己...原创 2019-08-25 15:04:27 · 811 阅读 · 0 评论 -
pjlib系列之非动态内存pool
pool简介pjlib的pool实现了内存池,使得可以不必频繁地创建释放内存,避免由此引起的内存碎片。官方文档为pjlib内存池poolpool共有这么几个组件:pool factory内存池工厂:用来管理内存池的policy:管理策略,工厂只是用来管理内存池对象,对于如何分配内存(使用malloc还是new),则由策略组件来实现。pool object:内存池对象,使用内存池...原创 2019-08-25 16:32:34 · 1241 阅读 · 0 评论 -
pjlib系列之线程thread及同步对象
操作系统抽象的API可以屏蔽操作系统特有的操作,使业务代码方便在不同平台移植。这部分实现主要是os_开头的几个文件,其中最重要的是os_core_unix.c(这里选择Linux平台)。我把这些分拆3类:1、线程Thread和本地线程存储TLSThread Local Storage;2、线程同步对象;3、时间和高精度定时线程本地存储线程共享进程的数据,访问需要同步,有时线程需要有自己的...原创 2019-08-27 16:45:43 · 952 阅读 · 0 评论 -
pjlib系列之时间time
Linux下的几种时间1、精确到秒级time_t本质上是一个long型time_t time(time_t *t);//此函数会返回从公元1970年1月1日的UTC时间从0时0分0秒算起到现在所经过的秒数。如果t 并非空指针的话,此函数也会将返回值存到t指针所指的内存。struct tm { int tm_sec; /* seconds */ i...原创 2019-08-27 17:03:15 · 418 阅读 · 0 评论 -
pjlib系列之时间戳timestamp
时间戳结构体定义在types.h,本质上是两个32位加上一个64位。根据宏PJ_HAS_INT64来决定是用一个64位存储还是用2个32位存储,该结构体存储的单位是系统频率,比如系统频率是纳秒,则pj_timestamp.u32.lo = 10表示经过了10个周期,也就是10ns。/** * This structure represents high resolution (64bit)...原创 2019-08-28 16:01:51 · 915 阅读 · 0 评论 -
pjlib系列之定时器timer
pjlib的定时器简介pjlib定时器是从ACE网络库移植过来的。实现在timer.h和timer.c,定时器的原理是有个将来的超时时间,这个时间就是现在时间加上定时器时长。pjlib定时器使用1、pj_timer_heap_create()创建定时器堆;2、pj_timer_heap_schedule()来调度定时器,也就是插入到定时器堆中,该函数实现堆的基本操作,一旦一个定时器结...原创 2019-08-28 16:26:04 · 829 阅读 · 0 评论 -
pjlib系列之错误errno
pjlib提供了一套统一的错误码,都是正数,并且屏蔽各系统的错误码。pjlib的错误在文件errno.h errno.c compat/errno.h os_core_unix.c。错误码范围分段/** * PJ_ERRNO_START is where PJLIB specific error values start. */#define PJ_ERRNO_START 20...原创 2019-08-29 11:28:58 · 512 阅读 · 0 评论 -
pjlib系列之数据结构fifobuf
fifobuf是个先进先出的队列,使用结构体pj_fifobuf_t表示。该结构体四个指针,其中first和last表示缓冲区的起始和结束,这两个指针初始化一次就不再改变,ubegin和uend指向数据的开始和结束,入队列时,uend后移,出队列时,ubegin后移,当uend后移到和ubegin相等时,缓冲区被填满了、full标志设1,直到有数据出队列时,才重新设0。struct pj_f...原创 2019-08-29 14:59:45 · 349 阅读 · 0 评论 -
pjlib系列之复用io队列ioqueue
ioqueue是pjlib的一个精华部分,实现基于Proactor模式的IO复用模型,关于Proactor与Reactor模式,可以参考IO模型。简单来讲,Reactor是监控到事件后,应用自己去读写;Proactor模式是检测到事件后,底层去读写,完成后通知应用。其本质区别就是谁去读写数据。ioqueue的实现在ioqueue.h ioqueue_common_abs.c ioqueue_com...原创 2019-08-30 10:52:19 · 1252 阅读 · 0 评论 -
pjlib系列之网络ip_helper
本地接口和ip枚举本地接口和ip在ip_helper.h和ip_helper_generic.c/** * Enumerate the local IP interfaces currently active in the host. * * @param af Family of the address to be retrieved. Application * ...原创 2019-08-30 15:06:25 · 269 阅读 · 0 评论 -
pjlib系列之IP地址解析
pjlib中对地址解析的封装在addr_resolv.h定义,实现在addr_resolv_sock.c和sock_common.c根据域名获取ip(仅支持IPv4)struct hostent *gethostbyname(const char *hostname)struct hostent{ char *h_name; //official name char...原创 2019-09-02 17:49:55 · 547 阅读 · 0 评论 -
pjlib系列之数学统计math
之前在看pjmedia的jbuf时,发现里面用到了pjlib中的数学统计,来实现抖动的测量。进去查看,发现方差的实现跟定义完全不一样,非常简洁,推导了1个多小时,终于推导出里面的代码实现原理。果然,程序员都是给数学家打工的。pjlib实现的数学和统计文件是math.h,没有math.c文件,所有实现都内联在头文件。其中统计结构体如下:/** * This structure descr...原创 2019-09-09 10:47:06 · 286 阅读 · 0 评论 -
pjlib系列之网络服务质量QoS
本篇文章预占位置,因为QoS目前接触不多。pjlib关于网络服务质量QoS的实现在sock_qos_xx几个文件,从注释大概了解到。实现了3个,其中二层有802.1p和WMM,三层有DSCP,也就是IPv4报文头的那个区分服务(Differentialted Services)。剩下的以后研究再补充。...原创 2019-09-05 20:33:03 · 288 阅读 · 0 评论 -
pjlib系列之网络安全
本文占位,关于加密知识还未整理,先不深入研究,这里从注释知道,使用SSL和TLS的网络加密。原创 2019-09-05 20:36:08 · 185 阅读 · 0 评论 -
pjlib系列之日志log
日志用法使用之前需要初始化日志,但这一步是内部函数pj_init自己调用的,应用程序无需显示调用。/** * Internal function to be called by pj_init() */pj_status_t pj_log_init(void);* PJ_LOG(3, ("main.c", "Starting hello..."));* PJ_LOG...原创 2019-09-06 11:45:58 · 855 阅读 · 0 评论