- 博客(19)
- 资源 (1)
- 收藏
- 关注
原创 C#中delegate的机制原理
C#下的关键字delegate实际上是告诉编译器生成一个继承自MulticastDelegate的密封类。而该类的主要职责是创建函数的回调环境。而生成的密封类定义如下:namespace DefineNameSpace{public delegate string DefineDelegate(bool a, bool b, bool c);public class Ot
2014-12-24 10:58:54
7557
原创 六 Doubango协议栈中对RTP的管理
相关数据结构1. tsip_dialog_invite_t描述:一个invite_dialog代表了一个invite期间的所有的信令流程,因此,它首先是一个普遍的dialog的特殊化结构,在该结构的起始部分,有一个TSIP_DECLARE_DIALOG声明,该声明展开后是一个tsip_dilog_t __dialog字段的定义,这是一种在C中一个具化对象对通用对象的继承机制,ts
2012-08-27 11:29:12
5689
原创 五 SIP中一个INVITE消息的发起过程
SIP协议的INVITE消息发起流程当通过sip协议发起一个会话时,需要通过invite消息实现该流程。而SIP协议是一个基于事务的协议,每一个sip会话的都是通过sip部件间的一系列消息来完成的。首先需要明确的重要概念就是事务。事务在SIP协议中,一个事务是指完成一次消息交互的整个流程。以INVITE消息为例,一个基于代理服务器交换信令和语音视频数据包的事务模型如下图所示:如
2012-07-06 17:06:22
24272
1
原创 四 SIP协议栈传输层的启动(1)
协议栈的默认传输结构对于一个刚启动的协议栈来说,它需要有一个传输层,支持若干的传输结点。每一个传输结点对应于一个端口,若采用TCP连接,一个传输结点就针对于一个点到点的连接,这个连接负责sip信令的可靠交换;若采用UDP进行sip信令的交换,则需要由应用程序维护一个定时器,以防数据包丢失的时候用于重传。 Doubango里一个协议栈对应于一个tsip_stack_t实例,而这样一个实例
2012-07-04 17:27:40
4724
原创 三 协议栈的启动过程
协议栈启动的上层接口 对于Doubango中得sip协议栈,是通过SipStack类粘合上层代码与底层代码的,该类定义在SipStack.h中,实现在SipStack.cxx中。当构造好一个SipStack实例之后,对于底层而言,实际上是创建了一个tsip_stack_t 的实例,这个实例在SipStack类中通过tsip_stack_handle_t *handle字段指向。
2012-07-02 15:56:30
2405
原创 二 底层协议栈结构分析
tsip_stack_handle_t 实例1. tsip_stack_handle_t的创建在底层,真正运转的协议栈结构式tsip_stack_handle_t的一个实例,它的创建时机为SipStack类在构造时,也就是说,当上层不管用何种方式触发一个SipStack的创建动作时。在上层,SipStack会被继续抽象封装,这种封装有可能是封装成为一个java类,一个C#类,
2012-07-02 14:21:06
2678
原创 一 从协议栈结构说起
自顶向下与自底向上软件设计的两种方法不过于自顶向下与自底向上。对于自顶向下而言,先设计好用户接口,再往下延伸至各个功能块的具体实现。而对于自底向上而言,自然是有了设计好的各个功能代码块,再将这些功能代码块拼接成具体的用户接口,然而实际的软件实践中,这两种方法是同时展开的,因为无论单独实施哪一种,都是有所缺陷,会令人陷入某种困境。设计软件如此,那么在分析一款软件的时候,结合自顶向下与自底
2012-07-02 11:49:32
3068
原创 malloc与free
关于malloc与free1. 这两个函数是库函数,不是操作系统中真正对进程虚拟地址的释放(例如Linux的brk系统调用才是真正的申请和释放)2. free并不代表操作系统对于进程虚拟空间真正的释放,因此在释放后该块地址对于进程来说还是可以访问的(并不会引起非法地址访问的错误,在调用free后,库可能会将这段内存标记为一个很大得值,例如在windows下的0xfeee
2012-04-13 15:57:39
825
原创 一个关于extern"C"下函数指针行为的测试用例
本例测试在VS2008下extern "C" 对函数名以及函数指针的影响.//test.h#ifndef TEST_H#define TEST_H#include #define BUFSIZE 1024 #ifdef __cplusplusextern "C"{#endifextern "C" void(*pf2)(void);void pf3(
2012-02-12 15:05:15
1662
原创 FreeSwitch B2B 状态转换流程(1)
以1002 呼叫 1003 为例。Sip的状态流程1002向FS发起INVITE消息,经过一次认证通过,1002在此向FS发起INIVTE消息。此时FS所做的处理为:1. 捕获该sip消息,在sofia中有一个对于ua Event消息事件的枚举定义:typedef enum nua_event_e { ………. nua_i_invite;//这个值
2012-02-09 14:55:06
4619
原创 operator=相关思考
一. operator=返回值及形参的讲究:1.string& string::operator=(const string& rhs){ return *this;}在这种情况下 ,赋值操作符的重载可以面对的几种情况:①. string s1; s1 = "Hello"; 此时编译器会做如下处理: const string __te
2012-02-07 11:45:21
826
原创 FreeSwitch Lua编程接口(1)dialplan里的配置
Dialplan里的配置可以为freeswitch配置一个或若干个号码,当其他的sip终端通过拨打此号码时,通过拨号路由,查找到此号码,从而执行lua脚本。在Dialplan里的配置如下: 需要说明的是:dialplan是通过xml寻找拨号规则的,具体流程为:①sip信令到达,invite消息
2012-02-06 15:54:35
4996
原创 B2B在FreeSwitch中的呼叫流程
假设1003 呼叫 10021003向FS发送inivte消息:sofia模块收到sip消息后回调sofia_event_callback进入sofia_handle_sip_i_invite为1003建立session与channel,进入1003的channel状态机。一次执行:1003的CS_INIT1003的CS_ROUTING1003的CS_EXECUTE:
2012-02-06 15:53:49
4013
原创 理解对象的构造时发生的情况
当一个对象被创建时,会发生什么情况呢?例如:templateclass boy{ public: boy(const string &new_name, T *ptr){ name = newname; adress = ptr; } .....
2012-02-05 18:35:26
637
原创 FreeSwitch全局配置文件处理流程
FreeSwitch中配置文件读取顺序在FS里,最先读取的配置文件是置于安装目录下的conf文件夹下的freeswitch.xml文件,在程序启动初始化阶段,会调用switch_xml_init()函数来完成该配置文件的读取和预处理工作。这里所说的预处理是在在FreeSwitch调用自己的xml解析器解析配置文件时,如果遇到文档标志为X-PRE-PROCESS,便会对相应的参数作出处理。例如下
2012-02-04 15:27:31
2648
原创 FreeSwitch 模块加载过程
switch_loadable_module_load_module_ex函数原型如下:static switch_status_t switch_loadable_module_load_module_ex(char *dir, char*fname, switch_bool_t runtime, switch_bool_t global, constchar **err)传入这
2012-02-03 11:45:52
3622
原创 FreeSwitch 的初始化及其模块加载过程
FS 主函数main()Freeswitch的主函数是在文件switch.c中定义的,该文件的260行是整个程序的入口,主函数主要完成的功能是包括,命令行解析,初始化apr库,构建全局内存池,模块加载和初始化核心组件。 初始化apr库是由apr_initialize()函数完成的,apr库是apache的可移植动态库,完成相关的内存池,线程管理的跨平台工作。该函数的调用在主函数
2012-02-02 15:23:34
6918
原创 数组引用的思考
@当给一个函数传递数组相关的参数时,除了可以传递数组的起始地址,还可以传递整个数组的引用。 如: void function(int (&arr)[10]);此时,将函数的形参声明为一个数组的引用,这个数组的大小是10个int元素。对于该函数的使用方法为: int main(){ int i = 0, j[2] = {1,2}; int k[10
2012-02-01 21:05:37
721
原创 从编译器角度理解虚函数和继承
在c++中,继承的概念可以理解为c中得嵌套结构体,对于各种函数,类中的成员函数,类中的友元函数,各种继承的虚拟函数,只要从编译器的角度去理解就会变得简单。例如下例:class D{ public: int func_D(); int v_func_DD();};class D1 : public D{ public: int func_D
2012-01-31 15:05:04
908
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人