osip编译方法

合集下载

软AP的实现------hostapd的编译运行

软AP的实现------hostapd的编译运行

软AP的实现------hostapd的编译运⾏最近要给摄像头做⼀个软ap,让⼿机能够连上这个热点,从⽽能够与摄像头进⾏通信。

1、什么是hostapd :hostapd能够使得⽆线⽹卡切换为master模式,模拟AP(通常可以认为是路由器)功能,也就是我们说的软AP(Soft AP)。

Hostapd的功能就是作为AP的认证服务器,负责控制管理stations(通常可以认为带⽆线⽹卡的PC)的接⼊和认证。

通过Hostapd可以将⽆线⽹卡切换为AP/Master模式,通过修改配置⽂件,可以建⽴⼀个开放式的(不加密)的,WEP,WPA或WPA2的⽆线⽹络。

并且通过修改配置⽂件可以设置⽆线⽹卡的各种参数,包括频率,信号,beacon包时间间隔,是否发送beacon包,如果响应探针请求等等。

还可以设置mac地址过滤条件等。

下⾯是⽆线⽹卡常见的⼯作模式及其作⽤。

2、编译移植基于RTL8188EUS⽆线⽹卡的驱动程序版本:wpa_supplicant_hostapd-0.8_rtw_r7475.20130812进⼊hostapd⽬录,修改Makefile 找到如下语句:ifndef CCCC=gccendif删除上⾯的语句,改成⾃⼰编译服务器的gcc,然后make。

CROSS_COMPILE=arm-xxxx-linux-CC=$(CROSS_COMPILE)gcc⽣成hostapd和hostapd_cli3、运⾏hostapd,创建软APvi /etc/hostapd.conf1)、创建不需要密码的APctrl_interface=/var/run/hostapdinterface=wlan0driver=rtl871xdrvssid=Ap117081234000009channel=8macaddr_acl=0auth_algs=1ignore_broadcast_ssid=02)、创建wep加密类型的APctrl_interface=/var/run/hostapdinterface=wlan0driver=rtl871xdrvssid=Ap117081234000009channel=8macaddr_acl=0auth_algs=2ignore_broadcast_ssid=0wep_key0=1234567891200wep_default_key=03)、创建wpa psk加密类型的APctrl_interface=/var/run/hostapdinterface=wlan0driver=nl80211ssid=Ap117081234000009channel=1macaddr_acl=0auth_algs=1ieee80211n=1hw_mode=gignore_broadcast_ssid=0wpa=2wpa_passphrase=123456789wpa_key_mgmt=WPA-PSKwpa_pairwise=TKIPrsn_pairwise=CCMP运⾏命令: ./hostapd -B /etc/hostapd.conf -dd电脑可以搜到这个wifi,但是连接不上⼿机也可以搜到连不上的原因是没有dhcpserver为其分配IP。

osip工作原理和过程

osip工作原理和过程

OSIP工作原理和工作过程雷/wcl0715感谢OSIP代码整理小组的工作。

一、概述:首先说明一个概念:OSIP是一个开原的标准C的sip 3261的CORE,实际上是一个SIP 的信令实现,从另一个角度说,它是SIP的一个信令解释器,任务是负责生成和解析SIP信令,仅此而已,其它的事情,比如收包,发包,建立RTP流的过程等等和OSIP没有任何必然关系。

理论上OSIP可以应用在任何可以编译C语言的系统上。

二、工作原理OSIP实现的核心是状态机,为了便于保持逻辑的清晰和代码模块化的实现,OSIP分成两对状态机,分别用来处理正常的CALL流程和其它非CALL流程,对应的每对状态机又分成out和in两个状态,因此OSIP共有四个状态机。

详细的状态机部分文挡请参考OSIP 的状态机分析,在我们的资源连接里你可以找到它,你也可以登陆我的BLOG来寻找它。

对不同的状态OSIP相应的用不同的状态机处理,在这些状态机下,OSIP对本身或者来自对方的消息进行处理,从而推动自身状态的改变,这也就是OSIP的核心工作原理。

和其它的SIP协议栈的实现一样,OSIP采用CALLBACK函数的方法来对用户程序提供接口,当系统有事件发生,或者状态改变的时候,OSIP调用这些CALLBACK函数,来完成用户的要求(比如收到对方180消息后,本地要响铃,实现方法就是在OSIP的收到180消息的CALLBACK函数里实现响铃代码),因此OSIP用户需要自己编写这些CALLBACK 函数,实现自己所需要的功能,然后在系统初始化过程中,和系统callback函数挂接,这样当系统调用CALLBACK的时候就会执行你的函数,这也就是OSIP初始化的时候,要设定一大堆CALLBACK函数的原因,在接触协议初期,也许你觉得烦琐,但尽可能多的让用户能对事件进行处理,才能保证协议栈的可用性这样,这在系统越来越复杂的情况下,或者应用比较复杂的情况下,尤为重要。

网路编程基础步骤和方法

网路编程基础步骤和方法

网路编程基础步骤和方法部门: xxx时间: xxx整理范文,仅供参考,可下载自行编辑异步套接字分类:VC 2018-03-31 10:54 422人阅读评论(0> 收藏举报一、TCP/IP 体系结构与特点1、TCP/IP体系结构TCP/IP协议实际上就是在物理网上的一组完整的网络协议。

其中TCP是提供传输层服务,而IP则是提供网络层服务。

TCP/IP包括以下协议:<结构如图1.1)b5E2RGbCAP(图1.1>IP:网间协议(Internet Protocol> 负责主机间数据的路由和网络上数据的存储。

同时为ICMP,TCP,UDP提供分组发送服务。

用户进程通常不需要涉及这一层。

ARP:地址解读协议(Address Resolution Protocol> 此协议将网络地址映射到硬件地址。

RARP:反向地址解读协议(Reverse Address Resolution Protocol> 此协议将硬件地址映射到网络地址ICMP:网间报文控制协议(Internet Control Message Protocol> 此协议处理信关和主机的差错和传送控制。

TCP:传送控制协议(Transmission Control Protocol> 这是一种提供给用户进程的可靠的全双工字节流面向连接的协议。

它要为用户进程提供虚电路服务,并为数据可靠传输建立检查。

<注:大多数网络用户程序使用TCP)UDP:用户数据报协议(User Datagram Protocol> 这是提供给用户进程的无连接协议,用于传送数据而不执行正确性检查。

FTP:文件传输协议(File Transfer Protocol> 允许用户以文件操作的方式<文件的增、删、改、查、传送等)与另一主机相互通信。

SMTP:简单邮件传送协议(Simple Mail Transfer Protocol>SMTP协议为系统之间传送电子邮件。

在arm-linux编译osip-exosip2(lhl)

在arm-linux编译osip-exosip2(lhl)

在arm-linux编译osip,exosip21osip,exosip2简介Osip2是一个开放源代码的sip协议栈,是使用C语言写的协议栈,它具有短小简洁的特点,专注于sip底层解析使得它的效率比较高。

但缺点也很明显,首先就是可用性差,没有很好的api封装,使得上层应用在调用协议栈时很破碎;其次,只做到了事务(transaction)层次的协议过程解析,缺少呼叫(call)、会议(session)、对话(dialog)等过程的解析,这也增加了使用的难度;再次,缺少线程并发处理的机制,使得它的处理能力有限。

eXosip是Osip2的一个扩展协议集,它部分封装了Osip2协议栈,使得它更容易被使用。

eXosip增加了call、dialog、registration、subscription等过程的解析,使得实用性更强。

但是eXosip局限于UA的实现,使得它用于registrar、sip se rver等应用时极其不容易。

另外,它并没有增加线程并发处理的机制。

2下载:a)/gnu/osip/b)/releases/exosip/3配置编译环境交叉编译环境库路径拷贝到“/home/lhluser/tools/arm-bcm2708”,运行下面命令,配置环境变量。

复制下面语句到命令行#export CC=/home/lhluser/tools/arm-bcm2708/arm-bcm2708hardfp-linux-gn ueabi/bin/arm-bcm2708hardfp-linux-gnueabi-gcc4编译osip2a)将libosip2-3.6.0.tar.gz解压到“/home/lhluser/LHL/libosip2-3.6.0”b)#cd /home/lhluser/LHL/libosip2-3.6.0c)#mkdir osiparmlib 建立工作路径d)#cd osiparmlib 进入工作路径e)#chmod +x ../configure 修改文件为可执行查看configure配置文件:$./../configure --help > osip2_configure_help. txtf)#./../configure --prefix=/home/lhluser/LHL/armlib --target=arm-linux --host=arm-linux --enable-static=yes --enable-shared=nog)#makeh)#make install完成后,生成的libosip2.so.7.2.0、libosip2.a、libosipparser2.so.7.2.0和libosipparser2.a库文件在“/home/lhluser/LHL/armlib/lib”目录下,inc lude文件在“/home/lhluser/LHL/armlib/include”下5编译eXosipa)将libeXosip2-3.6.0.tar.gz解压到“/home/lhluser/LHL/libeXosip2-3.6.0b)#cd /home/lhluser/LHL/libeXosip2-3.6.0c)#cp ../armlib/lib/* /usr/lib/d)#cp -r ../libosip2-3.6.0/osiparmlib/include/osipparser2 ../libeXosip2-3.6.0/include/osipparser2e)#cp -r ../libosip2-3.6.0/osiparmlib/include/osip2 ../libeXosip2-3.6.0/include/osip2f)#mkdir eXosiparmlib 建立工作路径g)#cd eXosiparmlib 进入工作路径h)#chmod +x ../configure 修改文件为可执行查看configure配置文件:$./../configure --help > eXosip2_configure_hel p.txti)#./../configure --prefix=/home/lhluser/LHL/armlib --target=arm-linux --host=arm-linux --enable-static=yes --enable-shared=no j)#make cleank)#makel)#make install完成后,configure文件中指示生成路径为“/home/lhluser/LHL/armlib”,生成的l ibeXosip2.so.7.2.0和libeXosip2.a库文件在“/home/lhluser/LHL/armlib/lib”目录下,include文件在“/home/lhluser/LHL/armlib /include”下6验证示例程序:6.1创建qt工程“文件”“新建文件或项目”“QT Gui 应用”名称:eXosip2_init创建路径:/home/lhluser/LHL/eXosip2_init使用构建套件:ARM_Kit进入“项目”“构建和运行”“构建设置”将“Release”和“Debug”中的影子工程(Shadow build)去掉6.2复制编译好的库和头文件到该工程路径下$ cp -r /usr/local/include /home/lhluser/LHL/eXosip2_init/eXosip2_ini t/include$ cp -r /usr/local/lib /home/lhluser/LHL/eXosip2_init/eXosip2_init/li b建立调用库路径()和头文件路径()6.3添加代码修改工程文件“eXosip2_init.pro”,添加头部和库路径说明如下:INCLUDEPATH += ./includeINCLUDEPATH += ./include/eXosip2INCLUDEPATH += ./include/osip2INCLUDEPATH += ./include/osipparser2INCLUDEPATH += .l/include/osipparser2/headersQMAKE_LIBDIR += ./libLIBS += -losip2LIBS += -losipparser2LIBS += -leXosip2在文件“main.cpp”的头部添加头部说明extern "C"{#include <eXosip.h>}在文件”main.cpp”的“int main(int argc, char *argv[])”中添加如下代码,用于测试编译库是否正确。

oSIP开发者手册

oSIP开发者手册

oSIP开发者手册选择自 IOKE 的 Blog关键字 oSIP开发者手册oSIP开发者手册——本手册指导开发者利用oSIP栈开发用户代理原文标题:oSIP User Manual原文作者:Aymeric Moizard联系方法:jack@版权保护:GNU Free Documentation License项目网站:译文作者:陈善学联系方法:chenshanxue@摘要“会话发起协议(Session Initiation Protocol-SIP)是一个应用层的信令控制协议。

用于创建、修改和终止一个或多个参与者的会话。

这些会话可以是Internet多媒体会议、IP电话或多媒体分发(例如:语音信箱)。

会话的参与者可以通过组播(multicast)、网状单播(unicast)或两者的混合体进行通信。

”"The Session Initiation Protocol (SIP) is an application-layer control (signaling) protocol for creating, modifying and terminating sessions with one or more participants. These sessions include Internet multimedia conferences, Internet telephone calls and multimedia distribution. Members in a session can communicate via multicast or via a mesh of unicast relations, or a combination of these."版权本文的版权归Aymeric Moizard所有。

允许拷贝、分发和在”GNU Free Documentation License”(版本1.1或由自由软件基金会最近发布的任何版本)下的定制。

osip源代码框架详

osip源代码框架详

Osip协议源代码框架详解Revision History目录Osip源代码框架详解1符号及缩写2整体描述开源代码的osip协议栈分为两个源代码包,整个协议栈采纳lib库的形式,在内部没有利用到任务,采取与TCP/IP协议栈一样的策略,因此在利用上需要上层治理任务直接挪用lib库提供的接口。

因为在Lib库内部没有利用到像按时器、发送队列等的任务,而同时需要利用到按时器,因此在lib库的内部采纳轮训遍历的方式不断的检查是不是有按时器超时,这在某种程度上会浪费CPU的许诺时刻。

同时整个lib库实现了对call, notify等的治理,为了实现重入,在应用启用多线程的条件下,内部启用的信号量和锁的利用,在下面的分析中不涉及到信号量和锁机制。

Lib库依照sip协议栈的层次关系分为两个lib包,底层的osip lib包实现对单个请求、应答、ACK的处置,包括message的解析、拼装、内容set和get,单个请求形成的transaction相关操作和通信两头形成的一个dialog 的操作。

Lib库上层的exosip lib在底层osip lib库的实现基础上,实现对sip协议整理逻辑上的治理。

Exosip要紧关注的是sip协议的业务流程,包括call的整体治理,notify的整体治理,publish的治理,register的治理,option 的治理,refer的治理和subscription的治理,其中最要紧的为call和register的治理,这两个为sip协议栈必须实现的部份,另几个功能为sip协议栈扩展部份。

从这几个业务的治理流程起身,在业务的底层它们会利用到相似的一些功能,如注册的认证,发送message,接收message,每一个请求和应答形成的transaction,多个transaction 组合而成的dialog。

在message的处置方面,能够分为两类,一类为发送的message,因为是主动发送,因此上层治理层明白是什么类型的message,lib库直接提供各类接供词利用。

osip2协议栈原理分析以及总结

osip2协议栈原理分析以及总结

OSIP2协议栈学习总结1、Osip2协议栈介绍Osip2是一个开放源代码的sip协议栈,是开源代码中不多使用C语言写的协议栈之一,它具有短小简洁的特点。

它的核心特性为sip协议数据的解析和事务的管理。

数据包的收发、RTP 流的处理等,并不在Osip2中完成。

应用程序使用Osip 时需要单独去实现这些模块。

Osip2的缺点是没有很好的上层api封装,使得上层应用在调用协议栈时很破碎;只做到了transaction层次的协议过程解析,缺少call、session、dialog等过程的解析,这也增加了使用的难度。

2、Osip2协议栈体系结构OSIP主要由解析模块、工具模块和状态机模块构成,其核心是状态机模块.OSIP结构如图所示.2.1 语法解析器libosip库源码src/osipparser2为解析器源码,OSIP解析模块主要用于对SIP请求与响应进行封装与解析处理,分为SIP解析、URL解析与SDP解析完成对sip协议相关字段的构造和解析。

比如,将紧凑的存储于内存buffer中的sip 数据解析到清晰定义的数据结构体中,每一个字段代表sip协议中有意义的一个头域。

SIP解析主要负责SIP标题头的解析与封装。

SDP解析除了对数据包中SDP会话各类型进行解析外还包含对各类型的初始化和释放操作以及对整个SDP包的一些基本操作。

URL解析主要负责对SIP URI中包含的host,port,username,password等信息进行解析与设置。

2.2 有限状态机SIP状态机模块负责完成对某个事务状态的维持及处理。

并且在特定的状态下触发相应的事件或者回调函数。

OSIP协议栈的状态机主要分为4类:INVITE客户端事务ICT,非INVITE 客户端事务NICT,INVITE服务器端事务IST,非INVITE服务器端事务NIST。

2.3 工具模块OSIP工具模块分为对话管理工具和SDP协商工具。

对话管理工具使用户能够根据RFC3261对dialog进行操作,建立相应dialog结构体。

osip学习说明

osip学习说明

oSIP工作过程
• 1、
系统初始化过程。
• 在OSIP工作之前,必须先初始化,主要有以下几个部分: • (1)系统资源申请,包括资源和链表的处理。 函数:osip_init() • (2)设置系统osip_set_message_callback函数 • (3)打开接收远端消息接收通道。它包括以下几个步骤
系统内部事务的产生过程
• 包括一个新的invite、 response、ack的发送 或接收,除了对非2xx 的应答ack外,其他的 请求和应答都会产生 一个新的transaction, 并且产生一个新的 sipevent事件。
_eXosip_transaction_init
osip_new_outgoing_sipmessag e (invite)
Kill event?
Y
osip_free (evt)
No
fsm_callmethod
osip的transaction的管理
• • • • • • • • • • • • • struct osip { void *application_context; /**< User defined Pointer */ /* list of transactions for ict, ist, nict, nist */ osip_list_t osip_ict_transactions; /**< list of ict transactions */ osip_list_t osip_ist_transactions; /**< list of ist transactions */ osip_list_t osip_nict_transactions; /**< list of nict transactions */ osip_list_t osip_nist_transactions; /**< list of nist transactions */ } 上面结构事务管理列表结构体,从中可以看出,事务分成4个不通的类型进行管 理,如果我们需要调用OSIP协议栈的话,必须自己先创建事务管理控制块,只需要 定期扫描该控制块下面的4个不通事务管理列表进行处理即可. osip_create_transaction创建事务 osip_find_transaction查询事务 osip_transaction_free清楚事务

linux固件编译过程

linux固件编译过程

linux固件编译过程Linux固件编译过程在Linux系统中,固件是指驱动程序加载到硬件设备上时所需的程序和数据。

固件编译是将源代码转换为可执行的固件文件的过程。

本文将逐步介绍Linux固件编译的过程。

1. 安装编译环境在开始进行固件编译之前,需要安装编译环境。

这包括GNU工具链(如gcc、make等)、交叉编译工具链(如果需要为不同的平台编译固件)、源代码管理工具(如git、svn等)以及其他所需的开发工具和库。

可以使用系统的包管理器来安装这些软件。

2. 获取源代码获取所需的源代码。

这可以通过下载稳定版本的源代码包或者克隆版本控制系统中的存储库来实现。

通常,固件的源代码可以从设备制造商的网站或开发社区中获得。

使用版本控制系统可以方便地更新和管理源代码。

3. 配置编译参数进入源代码目录并运行配置命令。

该命令将根据所需的目标平台、要编译的功能模块以及其他选项进行设置。

通常,配置命令是通过运行"./configure"或者"cmake"来完成的。

这些命令将检查系统环境并生成构建系统所需的Makefile文件。

4. 构建固件使用make命令来构建固件。

make命令将根据Makefile文件中的规则和依赖关系来编译源代码。

在构建过程中,make将执行所需的编译器命令,并生成目标文件和可执行程序。

构建过程可能需要一些时间,具体取决于源代码的大小和复杂性。

5. 安装固件构建完成后,可使用make install命令将固件安装到指定目录中。

安装目录通常是Linux系统的根目录下的/lib/firmware。

这样,系统在加载驱动程序时将能够找到并加载相应的固件文件。

6. 测试和调试当固件完成安装后,可以进行测试和调试。

这可以包括运行固件的功能测试集、检查日志文件以及使用特定的工具进行调试。

测试和调试的目的是验证固件的正确性和稳定性,并修复可能出现的问题。

7. 发布和更新一旦固件通过了测试和调试,可以将其发布到设备制造商的网站或开发社区中。

Linux编译sip库及第一个demo

Linux编译sip库及第一个demo
结果又是一顿报错:
./lib/libeXosip2.a(eXutils.o): In function `_eXosip_dnsutils_srv_lookup': /jiang/workspace/siplib/libeXosip2-3.6.0/src/eXutils.c:3040: undefined reference to `__res_query' /jiang/workspace/siplib/libeXosip2-3.6.0/src/eXutils.c:3056: undefined reference to `__dn_expand' /jiang/workspace/siplib/libeXosip2-3.6.0/src/eXutils.c:3074: undefined reference to `__dn_expand' /jiang/workspace/siplib/libeXosip2-3.6.0/src/eXutils.c:3159: undefined reference to `__dn_expand' ./lib/libeXosip2.a(eXutils.o): In function `eXosip_dnsutils_naptr_lookup': /jiang/workspace/siplib/libeXosip2-3.6.0/src/eXutils.c:3252: undefined reference to `__res_query' /jiang/workspace/siplib/libeXosip2-3.6.0/src/eXutils.c:3284: undefined reference to `__dn_expand' /jiang/workspace/siplib/libeXosip2-3.6.0/src/eXutils.c:3314: undefined reference to `__dn_expand' /jiang/workspace/siplib/libeXosip2-3.6.0/src/eXutils.c:3397: undefined reference to `__dn_expand' ./lib/libosip2.a(port_sema.o): In function `osip_sem_init': /jiang/workspace/siplib/libosip2-3.6.0/src/osip2/port_sema.c:170: undefined reference to `sem_init' ./lib/libosip2.a(port_sema.o): In function `osip_sem_destroy': /jiang/workspace/siplib/libosip2-3.6.0/src/osip2/port_sema.c:182: undefined reference to `sem_destroy' ./lib/libosip2.a(port_sema.o): In function `osip_sem_post': /jiang/workspace/siplib/libosip2-3.6.0/src/osip2/port_sema.c:193: undefined reference to `sem_post' ./lib/libosip2.a(port_sema.o): In function `osip_sem_wait': /jiang/workspace/siplib/libosip2-3.6.0/src/osip2/port_sema.c:202: undefined reference to `sem_wait' ./lib/libosip2.a(port_sema.o): In function `osip_sem_trywait': /jiang/workspace/siplib/libosip2-3.6.0/src/osip2/port_sema.c:211: undefined reference to `sem_trywait' ./lib/libosip2.a(port_thread.o): In function `osip_thread_create': /jiang/workspace/siplib/libosip2-3.6.0/src/osip2/port_thread.c:55: undefined reference to `pthread_create' ./lib/libosip2.a(port_thread.o): In function `osip_thread_join': /jiang/workspace/siplib/libosip2-3.6.0/src/osip2/port_thread.c:76: undefined reference to `pthread_join' collect2: ld returned 1 exit status

exosip osip 交叉编译

exosip osip 交叉编译

exosip和osip是两种常用于SIP(会话初始协议)协议栈实现的开源软件库,它们可以帮助开发人员在其应用程序中实现基于SIP协议的通信功能。

在某些情况下,由于开发环境的限制,我们可能需要进行交叉编译来将这些库移植到不同的评台上,本文将重点介绍如何使用交叉编译工具来将exosip和osip库移植到目标评台上。

1. 了解交叉编译的基本概念在开始介绍如何进行exosip和osip库的交叉编译之前,我们首先需要了解一些基本的概念。

交叉编译是指在一种评台上开发、编译出在另一种不同的评台上运行的应用程序的过程。

在实际应用中,我们可能需要在PC机上编译出在嵌入式评台上运行的程序,这就需要用到交叉编译工具链。

2. 准备交叉编译工具链在进行交叉编译之前,我们需要先准备好交叉编译工具链。

交叉编译工具链包括交叉编译器、交叉连接器、交叉汇编器等,它们用于将源代码编译成目标评台上可执行的程序。

可以从官方全球信息湾或者第三方渠道下载已经编译好的交叉编译工具链,也可以自行编译搭建交叉编译环境。

3. 配置编译环境在准备好交叉编译工具链之后,我们需要配置编译环境,以便将exosip和osip库移植到目标评台上。

配置编译环境包括设置交叉编译器的路径、指定目标评台的系统类型、设置编译选项等。

具体的配置步骤和方法可以参考官方文档或者相关的教程。

4. 下载源代码在配置好编译环境之后,我们需要下载exosip和osip库的源代码,这些源代码通常是以压缩包的形式发布在官方全球信息湾上,也可以从版本控制系统如Git、SVN等获取最新的源代码。

下载源代码后,我们需要解压缩并进行一些基本的配置。

5. 编译和安装在下载和配置完源代码之后,我们可以使用交叉编译工具链来编译和安装exosip和osip库。

编译和安装过程通常包括配置编译选项、执行编译命令、进行单元测试、安装到目标系统等步骤。

在编译和安装过程中可能会遇到一些依赖库缺失、编译错误等问题,这就需要我们根据具体情况进行调试和解决。

oSIP协议栈(及eXoSIP、Ortp等)使用入门

oSIP协议栈(及eXoSIP、Ortp等)使用入门

一直没空仔细研究下oSIP,最近看到其版本已经到了3.x版本,看到网上的许多帮助说明手册都过于陈旧,且很多文档内容有点误人子弟的嫌疑~~Linux下oSIP的编译使用应该是很简单的,其Install说明文档里也介绍的比较清楚,本文主要就oSIP在Windows平台下VC6.0开发环境下的使用作出描述。

虽然oSIP的开发人员也说明了,oSIP只使用了标准C开发库,但许多人在Windows下使用oSIP时,第一步就被卡住了,得不到oSIP的LIB库和DLL库,也就没有办法将oSIP使用到自己的程序中去,所以第一步,我们将学习如何得到oSIP的静态和动态链接库,以便我们自己的程序能够使用它们来成功编译和执行我们的程序。

第一阶段:------------------------------------------------------先创建新工程,网上许多文档都介绍创建一个Win32动态链接库工程,我们这里也一样,创建一个空白的工程保存。

同样,将oSIP2版本3.0.1 src目录下的Osipparser2目录下的所有文件都拷到我们刚创建的工程的根目录下,在VC6上操作:Project-AddToProject-Files将所有的源程序和头文件都加入到工程内,保存工程。

这时,我们可以尝试编译一下工程,你会得到许多错误提示信息,其内容无非是找不到osipparser2/xxxxx.h头文件之类。

处理:在Linux下,我们一般是将头文件,lib库都拷到/usr/inclue;/usr/lib之类的目录下,c源程序里直接写#include <xxx.h>时,能直接去找到它们,在VC里,同样的,最简单的方法就是将oSIP2源码包中的Include目录下的 osipparser2目录直接拷到我们的Windows下默认包含目录即可,这个目录在VC6的Tool-Options-Directories里设置,(当然,如果你知道这一步,也可以不用拷贝文件,直接在这里把oSIP源码包所在目录加进来就可以了),默认如果装在C盘,目录则为 C:/Program Files/Microsoft Visual Studio/VC98/Include。

osip源代码框架详解

osip源代码框架详解

Osipणᩲ⑤ҷۅḚᶊ᪪ᢧPrepared by Mao minghua Date2009.09.25Reviewed by DateApproved by DateRevision HistoryVersion Author Reviewed By Comments Issued Date 0.1Mao minghuaᦣẴosipֲᔩ৪োঞ෭ݭ4Ẵ4OSIP ࣙՈ⑤ᵤ53.1osip Ոtransaction Ոevent Ոѻ53.1.1ᯊ఼Ոѻẋ࣏63.1.2থՈџ73.2osip Ոtransaction Ոevent ˊ⌕73.2.1ICT Ո໘ˊ⌕83.2.2IST Ո໘ˊ⌕93.2.3NICT Ո໘ˊ⌕93.2.4NIST Ո໘ˊ⌕93.3Osip Ոᢧᵤ103.3.1sip णᩲՈᢧᵤᭈˊ⌕103.3.2Osip Ոᢧᵤ123.3.3uri Ոᢧᵤ143.3.4ϾᮄՈणᩲheader153.4osip Ոtransaction Ո੥ˊ163.5osip Ёdialog Ո੥ˊ18EXOSIP ࣙՈ⑤ᵤ194.1Lib Ո߱࣪੠⏄204.2Lib ՈЏˊඃ234.2.12xx ᑨਘՈₑথ໘ˊᴎࠊ244.2.2Exosip_execute 244.2.2.1Exosip_read_message Ո໘ˊ264.2.2.2eXosip_process_response_out_of_transaction Ո໘ˊ⌕˖294.2.3eXosip_automatic_action ˊ⌕294.3Call Ո໘ˊ304.3.1Call ՈৰϾINVITE 304.3.2INVITE ՈACK ᑨਘՈ߯੠থễ324.3.3dialog ݙՈ᪻Ո߯੠থễ334.3.4Dialog ݙanswer Ո߯੠থễ334.4Register Ո໘ˊ344.4.1Ͼ᳡ࡵ఼354.4.2Ͼ⊼Ո⊼ᯊᯊⒸ354.4.3থễϾregister35Osip⑤ҷۅḚᶊ᪪ᢧ෭ݭЁ᭛ICT Invite Client Transaction ,QYLWHିIST Invite Server Transaction ,QYLWHିNICT Not Invite Client Transaction ☢,QYLWHିNIST Not Invite Server Transaction ☢,QYLWHିIMS IP Multimedia Subsystem IPPSVT Packet service video telephony SIP Session Initiation Protocol UDP User Datagram Protocol URLUniform Resource LocatorՈosipणᩲЎϸϾ⑤ࣙˈᭈϾणᩲϬlibՈᔶˈ೼ݙᾬϬࠄӏࡵˈ₋ϢTCP/IPणᩲՈਚˈ᠔ҹ೼ՓϬϞˊӏࡵָϬlibՈ᥹ষDŽ಴Ў೼Lib ݙᾬϬࠄڣᯊ఼ǃথễ਍Ոӏࡵˈ໐ৠᯊ◄Ϭࠄᅮᯊ఼ˈ᠔ҹ೼lib ՈݙᾬϬḲՈᮍϡذՈẔᰃ৺ᯊ఼ᯊˈẝ೼ᶤCPUՈܕᯊⒸDŽৠᯊᭈϾlibɴњᇍcall, notify਍Ո੥ˊˈЎњɴₑܹˈ೼ᑨϬਃϬ໮ՈᴵϟˈݙᾬϬՈֵোₓ੠⏅ՈՓϬˈ೼ϟ☦ՈߚᵤЁϡ⍝ঞࠄֵোₓ੠⏅ࠊDŽLibsipणᩲՈሖЎϸϾlibࣙˈᑩՈosip libࣙᅲɴᇍऩϾ᪻ǃᑨਘǃACK Ո໘ˊˈࣙᣀmessageՈᢧᵤǃᣐǃݙᆍset ੠getˈऩϾ᪻Ոtransactionּ᪡԰ҹঞỞ঳ᔶՈϔϾdialogՈ᪡԰DŽLibՈexosip lib೼ᑩosip libՈᅲɴ෎ˈᅲɴᇍsipणᩲˊỿՈ੥ˊDŽExosipՈᰃsipणᩲՈϮࡵ⌕ˈࣙᣀcallՈᭈˊˈnotifyՈᭈˊˈpublishՈ੥ˊˈregisterՈ੥ˊˈoptionՈ੥ˊˈreferՈ੥ˊ੠subscriptionՈ੥ˊˈ݊Ё᳔ՈЎcall ੠registerՈ੥ˊˈẝϸϾЎsipणᩲɴՈᾬˈ঺Ͼࡳ࿁ЎsipणᩲDŽҢẝ޴ϾϮࡵՈ੥ˊ⌕থˈ೼ϮࡵՈᑩϬࠄּԐՈϔѯࡳ࿁ˈབ⊼Ոᩨˈথễmessageˈ᥹messageˈ↣Ͼ᪻੠ᑨਘᔶՈtransactionˈ໮Ͼtransaction໐៤ՈdialogDŽ೼messageՈ໘ˊᮍˈৃҹߚЎϸˈϔЎথễՈmessageˈ಴ЎᰃЏথễˈ᠔ҹϞˊሖᰃҔՈmessage ˈlibষկϬDŽϔЎ᥹ࠄՈmessageˈ಴Ўϡکᰃાˈ᠔ҹ◄ᵤߎᴹՈmessageՈֵᙃᴹẟᜐˊˈẝᾬՈ໘ˊ೼udp.cЁDŽϾlibՈ߱࣪೼exOsipЁҟDŽ Osip Ո⑤೼osipࣙЁ᳔ՈࣙᣀmessageՈּ݇᪡԰ˈ݊Ё᳔ₑᡅՈЎmessageՈᢧᵤˈेҢቻࠄՈϔϾmessageЁᢧᵤϣϾ࿁ˊՈmessage᭄᥂ᵘˉüosip_message_tDŽϢmessageᵘּ݇Ո᪡԰ࣙᣀmessage᭄᥂ᵘՈֵᙃᅝsipणᩲϾmessage৪І˗messageᵘՈ߱࣪੠₎˗messageᵘՈᣋ᪡԰˗ҹঞҢmessageᵘЁቻᵤՈ៤Ոؐ੠᪂า৘Ͼ៤ՈؐDŽ೼messageՈᢧᵤᾬˈ┨њmessageՈ༈໪ˈẜࣙᣀbodyՈᢧᵤˈ⍝ঞࠄsdpणᩲˈࣙᣀᇍ↣Ͼsdp ՈᢧᵤDŽ೼osipࣙЁˈ᪂ϾϢৠϔϾּ᪻݇Ո᠔᳝messageՈ▊transaction ˈ೼থễ៪᥹ࠄϔϾᮄՈ᪻Ոᯊ׭Ͼtransactionˈ݊ЁACK੠CANCEL ᰃ↨ṇĽ⅞Ոˈᇍ2xxᑨਘՈACK੠߱INVITEᰃৠϔϾtransaction Ոˈ໐ᇍ2xxՈ᪻ᰃՈtransactionՈˈ᠔ҹ݊ₑ᪡԰ϵUACᴹࠊˈ໐ϡ೼INVITEՈtransactionݙᾬẟᜐࠊDŽCANCELՈ᪻┨њᴀᵯϾtransaction ໪ˈḍणᩲCANCELՈ᪻Ոtransaction ˈབࡳӮCANCELּᑨՈtransactionDŽ೼osipࣙЁৠḋdialogּ݇᪡԰ˈࣙᣀdialogՈᓎˈdialogᙃՈᄬˈdialogՈঞ┨਍᪡԰DŽ݊ᅗˈࣙᣀЁՓϬࠄՈ⏅੠ֵোₓঞֵোˈݙᾬϬࠄՈˈϬՈⓣ(ẟ)ˈϔѯՈˈᅮᯊ఼ҹঞ਍ՈᅮDŽẝᾬ↨ṇ੄ˈ໐ᰃ᳔ߑ᭄ˈָϬሖDŽ .1osip Ոtransaction Ոevent ՈѻtransactionՈ࣪ᰃϵᴹՈˈᔧtransactionᯊˈḍՈ੠ᔧࠡtransactionՈᴹ໘ˊ᪩eventDŽTransactionՈџЎϸ˖ϔЎᅮᯊ఼ˈ೼᪂Ոᅮᯊ఼ᯊᯊӮּᑨՈᅮᯊ఼˗঺ЎџˈབথễϾ᪻ǃᑨਘ៪᥹ࠄϔϾ᪻ǃᑨਘˈথễϾACK੠᥹ࠄϔϾACKˈेᰃϵՈџDŽ .1.1ᯊ఼Ոѻẋ࣏ICT ǃIST ǃNICT ੠NISTՈᅮᯊ఼ՈџˈᇍϾtransactionˈ݊ᅮᯊᰃ᳝ՈˈICTЁTIMEOUT_B ՈˈTIMEOUT_Bᯊ఼থˈӮথkill transactionՈ᪡԰DŽᔧtransactionffЁ᳝ˊՈџᯊˈϡ໘ˊᅮᯊ఼ˈָಲˈ᠔ҹ೼transactionffЁՈџՈ᭄ₓᰃϡ໮ՈDŽ᠔᳝Ոᅮᯊ఼ߑ᭄᫇ϬᑩৠϔϾᅮᯊ఼ߑ᭄__osip_transaction_need_timer_x_event DŽ᪩ߑ᭄Ӯ᪩ᯊ఼ᰃ৺ˈЎ(timer->tv_sec == -1)ˈབˈẔᔧࠡᯊⒸᰃ৺ẋᅮᯊ఼Ё᪂ՈᯊⒸˈབᰃˈ߭Ոᅮᯊ఼DŽЎᅮᯊ఼ϾऩՈӏࡵˈ᠔ҹᰃ₋Ոᮍᰃ৺Ոᅮᯊ఼ˈ໐ϡᰃḍᯊЁẟᜐˈ಴↨ṇऴϬிDŽᯊ఼Ոਃ੠Ϭ᥹ষosip_gettimeofday ੠add_gettimeofdayDŽᯊ఼Ո᱉ᯊᯊⒸˈे᪂ϾᮄՈᅮᯊ఼DŽপϾᅮᯊ఼ˈᯊ఼Ոtimer->tv_sev Ў-1DŽ .1.2থՈџࣙᣀϾᮄՈinvite ǃresponse ǃackՈথễ៪᥹ˈ┨њᇍ2xxՈᑨਘack໪ˈ݊Ո੠ᑨਘϾᮄՈtransactionˈϾᮄՈsipeventDŽ .2osip Ոtransaction Ոevent೼sip णᩲЁЎњՈ໘ˊtransactionˈḍणᩲՈᦣẴˈЎϡৠՈtransactionˈߚЎICT ǃIST ǃNICT ੠NISTDŽϡৠՈtransactionϡৠՈ໘ˊ⌕੠ˈҹঞՓϬࠄϡৠՈᅮᯊ఼DŽICT ǃIST ǃNICT ੠NISTՈߑ᭄໘ˊᮍˈЎˊ੠ՓϬ⊼ߑ᭄ˈ⑤ЁՓϬњϾܼˊϡৠିtransactionՈ˖ict_fsmǃist_fsm ǃnist_fsm ੠nist_fsmDŽosipᵘབϟ˖struct osip {void *application_context;/**< User defined Pointer *//* list of transactions for ict, ist, nict, nist */osip_list_t osip_ict_transactions;/**< list of ict transactions */osip_list_t osip_ist_transactions;/**< list of ist transactions */osip_list_t osip_nict_transactions;/**< list of nict transactions */osip_list_t osip_nist_transactions;/**< list of nist transactions */ĂĂ}ˊ⌕བϟ೒˖೒ 5-1˖transactionՈevent.2.1ICTՈ໘ˊ⌕བϞ೒ˈICT ˊᯊ˖3)osipˊ඗ᵘЁՈosip_ict_transactionsˈབˈָಲOSIP_SUCCESS5)ЁϾ᭄ˈᄬtransactionࠄᯊ᭄ඈ10)᠔᳝transaction ˈosip_fifo_trygetϾtransactionЁՈџˈ᫇Ϭosip_transaction_executeˊ↣Ͼџˈָࠄ᠔᳝transactionЁՈ᠔᳝ˊˈಲDŽOsip_transacton_execute ᯊˈḍՈ᭄osip_transaction_t * transactionЁՈtransactionde ࠄՈܼˊবict_fsmˈevent Ոtype੠transactionՈϬfsm_callmethod೼᭛fsm_misc.cˈᰃߑ᭄ՈষüࠄeventՈ໘ˊߑ᭄ˈϬ໘ˊߑ᭄ẟᜐeventՈ໘ˊDŽICTՈּ݇eventՈ⊼ˊߑ᭄೼ict_fsm.c੠ict.cDŽICTϬࠄњ3Ͼᅮᯊ఼˖TIMEOUT_A ǃTIMEOUT_B ੠TIMEOUT_DDŽ೼client঳থễInvite໐◄ՈICT ՈtransactionᯊˈTIMEOUT_BˈᯊЎ64*DEFAULT_T1(DEFAULT_TI Ў500ms)ˈTIMEOUT_BЎᭈϾtransactionՈϣᯊˈབẋẝϾᯊⒸˈtransactionDŽབৠϬՈᰃ≵ՈUDPˈ߭าTIMEOUT_A ˈTIMEOUT_DՈⒸ╘ᯊⒸЎDEFAULT_T1੠64* DEFAULT_T1DŽབϬՈᰃ☦ՈTCPঞּ݇णᩲˈ߭ϬTCPݙᾬՈₑࠊˈϡ೼SIPणᩲՈࠊˈ᠔ҹϡਃTIMEOUT_A ੠TIMEOUT_D DŽTIMEOUT_AˊInviteՈˈ೼Inviteথễᯊˈਃᯊ఼TIMEOUT_Aˈ೼᱉ᯊᯊⒸݙẜࠄresponseՈᯊ׭ˈₑথ᪩Invite DŽTIMEOUT_DϬˊACKˈᔧࠄՈresponseϡᰃ>˙300ᯊˈclient঳থễACKˈᔧₑࠄ᪩invite Ոresponseᯊˈₑথ᪩ACKˈserver঳೼killtranctionࠄACKDŽ .2.2IST Ո໘ˊ⌕ৠICT Ո໘ˊ⌕ˈ໘ˊosipЁՈosip_ist_transactionDŽISTՈּ݇eventՈ⊼ˊߑ᭄೼ist_fsm.c੠ist.cDŽISTϬњᯊ఼TIMEOUT_GǃTIMEOUT_H੠TIMEOUT_IDŽՓϬᮍϢICTLˈणᩲDŽ .2.3NICT Ո໘ˊ⌕ৠICTՈ໘ˊ⌕ˈ໘ˊosipЁՈosip_nict_transactionDŽNICTՈּ݇eventՈ⊼ˊߑ᭄೼nict_fsm.c੠nict.cDŽNICTϬњᯊ఼TIMEOUT_EǃTIMEOUT_F ੠TIMEOUT_KDŽ .2.4NIST Ո໘ˊ⌕ৠICTՈ໘ˊ⌕ˈ໘ˊosipЁՈosip_nist_transactionDŽNISTՈּ݇eventՈ⊼ˊߑ᭄೼nist_fsm.c੠nist.cDŽNISTϬњᯊ఼TIMEOUT_JDŽ .3OsipՈᢧ.3.1sipणᩲՈᢧᵤᭈˊ⌕ᔧࠄϔϾmessageՈᯊ׭ˈ◄ᵤ᪩messageˈϣϾҷˊՈ᭄᥂ᵘˈ᪩ᵘᅮЎstruct osip_messageˈ᪩ᵘᅮՈϔϾmessageՈּܼ݇ᙃˈẝѯֵᙃЏᰃկtransaction੠dialogঞdialogՈབcallˈnotify਍ՈՓϬDŽᇍϔϾmessageՈᢧᵤ⌕བϟ೒᠔˖೼᥹ࠄϔϾmessageᯊˈ᫇Ϭߑ᭄osip_message_parseẟᜐmessageՈᢧᵤDŽϬߑ᭄osip_util_replace_all_lws messageЁՈɴՈ ‘\r\n\tÿǃþ\r\tÿǃþ\n\tÿǃþ\r\n ÿǃþ\r ÿǃþ\n ÿЎˈmessageᰃҹþ\0ÿЎ඗ՈˈmessageՈheaders੠ᰃҹ’\r\n\r\n’ЎՈˈࠄ’\r\n\r\n’Ўˈेheaders bodyՈߚɴՈ\t ǃ\r ǃ\nDŽϵѢsipणᩲˈ↣Ͼheadersᰃˈ໐Ո༈Ͼᄫ৪ϡЎ៪\tˈ᠔ҹϸϾheaderՈ\r\nϡӮˈՈᰃϔϾܕmultiՈheaderՈݙᾬϾؐПՈĀ\r\n\tā៪Ā\r\nāDŽབϟ˖᳝Ͼheaderˈ݊ЁSubject Ͼؐߎɴˈ RouteϾؐߎɴˈ໐ˈᰃߚҹ៪\tˈ໐Subject ੠Routeˈᰃ៪\tՈˈosip_util_replace_all_lwsߑ᭄ᇚRoute header valueЁՈϸՈ\r\n\t࣪Ўˈे೼ỿЎϔDŽSubject: Lunchute: <:a ce@tl nta co <:bo b@bi co<sip:carol@>Ͼmessageϵϝˈᰃmessage Ոstartlineˈ᪩ẝᰃϔϾsipՈmessage ˈࣙᣀsipˈ᪻៪ᑨਘˈؐˈҹ\r\nЎ੠headersՈߚ╘৪DŽ᪩\r\nϡӮosip_util_replace_all_lwsЎˈབ᪻ՈINVITE sip:bob@IP .0៪ᑨਘՈIP .0 200 O ˈ೼ϾϾDŽՈᢧᵤϵosip_me ssa st lin pa se ẟᜐᵤˈᢧᵤࠄme ssa Ոିˈme ssa Ոsipv sionҹঞme ssa Ոst s_cod ˈᔧst s_cod Ў߱࣪ؐ0ᯊˈ᪩me ssa ЎϔϾ᪻ˈ৺߭ЎᑨਘDŽ᪻Ոst lin ϵosip_me ssa st lin pa se ẟᜐᵤˈࠄ᪻Ոst i;ᑨਘՈst lin ϵosip_me ssa st lin pa se spẟᜐᵤDŽlin ՈᢧᵤᰃɴՈϾՈẟᜐᵤՈˈᇚᵤ඗ᄬ೼osip_me ssa Ո඗ᵘЁDŽᵤme ssg Ոsˈ᫇Ϭߑ᭄ msg s_pa seDŽosipՈᵤDŽབmessageЁ೼headersϡᰃ඗৪’\0’ˈ߭ණᵤmessageՈˈ᫇Ϭߑ᭄msg_osip_body_parseẟᜐᵤDŽMessage ՈbodyᵤheadersᵤЁᄬՈcontentेbodyՈ˖content_type ˈབcontent_typeЁՈtypeϡЎmultipartˈेϡmimeՈcontentˈbodyЁህϾˈָᇚϾbodyᵤЎϔϾݙᆍ˗བtype ЎmultitypeˈϾՈbody೼ϔϾᭈՈbodyˈ߭ҹ”--”Ўߚ╘৪ᢧᵤbodyˈᇚbodyЎ໮ϾmimeՈᄫ৪Іˈ↣ϾᢧᵤՈbodyݙᆍᄬ೼osip_messageᵘЁՈbodiesᵘ៤ЁDŽ .3.2OsipՈᢧᵤ೼ᢧᵤmessage ՈheaderՈᯊ׭ˈ಴ЎՈosip_util_replace_all_lws࣪њϾheaderݙᾬɴՈ\rǃ\n ੠\tЎˈ᠔ҹ↣ϾheaderҹՓϬ\r\nЎߚ╘৪ẟᜐ╘DŽབ৪Іstart_of_headerࠄ৪”\0”ˈ߭headerᵤˈಲࡳ˗᫇Ϭ__osip_find_next_crlfࠄẝϾheaderՈ඗৪ᄬ೼end_of_headerЁ˗བstart_of_headerЎ\r៪\nˈ߭ᵤࠄ\r\n\r\n ेheadersՈ඗৪Іˈ߭ẘಲࡳˈᄬstart_of_header ࠄbodyЁˈेbodyᰃҢ\r\n৪ІᵤՈˈ᠔ҹ೼bodyᵤᯊˈ◄ẋ\r\nঞПՈ˗ḍheaderݙᾬ╘৪Ā˖āˈপheaderՈhname ੠hvalueˈ݊Ёhvalue೼ᶤѯhnameՈϟᰃܕЎՈˈϬosip_message_set_multiple_headerᴹᵤ᪩headerՈhvalue৪І˗ᢧᵤ៤ࡳˈาstart_of_headerЎᏆᵤՈheaderՈend_of_header ˈᓔᵤϟϔϾheaderDŽ೼osip_message_set_multiple_headerЁˈᇚheadersЎϸˈϔབϞЁՈSubjectˈϾؐˈ߭Ϭosip_message_set__headerẟᜐᵤ˗ϔབϞЁՈRouterˈܕϾؐˈḍsipणᩲˈ↣ϾؐПҹĀˈāẟᜐ╘ˈ᠔ҹ◄Ͼhvalue৪Іˈḍ”,”ᇚhvalue╘Ͼؐˈ↣Ͼؐ᫇Ϭosip_message_set__header ẟᜐᵤᄬᵤ඗ࠄosip_messageՈ᭄᥂ЁDŽ಴ЎhvalueϬোᇚؐᴹˈ᠔ҹ◄Ľ߿ˊĀˈāᰃ৺ɴ೼োݙᾬՈDŽ೼ো໪ᾬՈĀˈāᠡᰃheaderؐՈߚ╘৪ˈ໐ݙᾬՈĀˈāাᰃϔϾheaderؐՈϔDŽosipЁosip_message_set__headerᇍmessage headersՈᢧᵤ₋Ϭ⊼ߑ᭄Ոᮍɴˈ₋Ϭẝ࢑೼ᴀᕜՈẟᜐՈheaderՈ⏏ˈϡӮࠄᭈϾՈḚDŽOsip_parser_cfg.cЁᅮheaderᵤ᠔ՓϬࠄՈܼˊব˖static__osip_message_config_t pconfig[NUMBER_OF_HEADERS];__osip_message_config_tՈ඗ᵘᅮབϟ˖typedef struct ___osip_message_config_t {char *hname;int (*setheader) (osip_message_t *, const char *); int ignored_when_invalid;}__osip_message_config_t;hname ЎsipणᩲՈ༈Ոᄫ৪Іˈẝѯᄫ৪І೼osip_const.hЁ˗ߑ᭄setheaderЎ᪩णᩲheaderՈᇍᑨՈᢧᵤߑ᭄˗ignored_when_invalid Ўᰃ৺᪩header ᵤՈˈ᪩ᷛؐЎ1ᯊˈ೼ᢧᵤ᪩णᩲheaderথễᯊˈ᪩⏝ˈ┨sipणՈ޴Ͼᖙheader ໪ˈ݊ᑨ᪩ϬDŽЎњՈḍheaderՈhnameˈࠄᇍᑨՈsetheaderᵤߑ᭄ˈ₋ϬњhashՈᶹˈḍhnameϾhashؐˈϾϡৠՈhnameᇍᑨࠄৠϔϾhashؐЁˈҹᦤՈDŽ᫇Ϭ__osip_message_is_known_header (hname)ࠄ೼᭄ඈЁՈindex,Ϭ__osip_message_call_method (my_index, sip, hvalue)ᵤणᩲheaderˈᵤՈᄬ೼඗ᵘosip_message_t * dest,ЁDŽϾheaderࣙ৿ϾỞϬՈ᪡԰˖header৪ІՈᢧᵤߑ᭄ˈेϞࠄՈosip_message_set_xxxᵤߑ᭄˗headerᵤՈ඗ᵘՈቻߑ᭄ˈosip_message_get_xxxߑ᭄˗ḍheaderᵤՈ඗ᵘϣ৪ІՈߑ᭄˖osip_xxx_str˗headerᵤՈ඗ᵘՈcopyߑ᭄osip_xxx_clone ˗headerᵤՈ඗ᵘՈᰃ৺ߑ᭄˖osip_xxx_free˗ҹঞheaderᵤ඗ᵘՈ߱࣪ߑ᭄˖osip_xxx_init DŽᇍ↣ϾheaderՈ޴Ͼּ݇᪡԰᳔ՈᰃᦤणᩲՈᭈϾheaderՈᭈ᪡԰ˈࣙᣀosip_message_init ˈosip_message_free ˈosip_message_clone ੠osip_message_parse DŽ .3.3uriՈᢧᵤՈheaderՈᢧᵤᰃּՈˈ݊Ё᭄᳝ՈᾬՈheaderՈᢧᵤӮ↨ṇ໡ᴖˈ᳔Ո᳝from ǃto ǃcontact਍ˈ಴Ў┨њᴀᵯ᭄П໪ˈ݊ؐЁՈrequest_uriᴀҹࣙ৿᭄ˈ໐ẝϸ᭄Пᰃ᳝ՈDŽSipणᩲheaderՈЎ header’s name, header’s value ੠header’s parameterDŽ݊Ёname ੠valueϬĀ˖ā╘ˈvalue ϢparameterϬĀ˗ā╘ˈparameterϬĀ˗āּߚ╘DŽ೼඗ᵘᅮЁheaderՈvalueheaderࣙ৿ՈֵᙃẟᜐᵘবՈᅮˈ໐བࣙ৿parameter߭Ͼgen_params Ոˈ᠔᳝Ոparameterᄬ೼ẝϾЁDŽབϟ☦fromՈᅮˈࣙ৿fromՈৡঞϔϾurlˈঞּ݇Ոparameter˖struct osip_from {char *displayname; /**< Display Name */ osip_uri_t *url; /**< url */osip_list_t gen_params; /**< other From parameters */ };ᇍᑨparameter ՈᢧᵤָϬ__osip_generic_param_parseallˈ᪩ߑ᭄ᢧᵤheaderՈऩϾhvalue৪ІЁࣙ৿Ո᠔᳝parameter ˈ೼ߑ᭄ݙᾬĀ˗āᇚ৪ІЎ޴Ͼparameterˈᵤ↣Ͼparameter ˈᇚᵤ඗ᄬ೼gen_paramsЁDŽParameterՈЎpname=pvalue ˈ਍োϸDŽFrom ǃto ǃcontactҹঞviaЁⒸɴurl DŽurlՈᢧᵤ᥹ষЎosip_uri_parseˈЎurlՈᄫ৪ІˈᢧᵤՈ඗ᵘᄬ೼඗ᵘosip_uri_tЁDŽurlࣙ৿ݙᆍ˖urlՈ෎ᴀᙃˈurl Ոheader੠urlՈ᭄ᾬDŽᓔϢheaderϬĀ?āẟᜐ╘ˈheaderϬ”&”ẟᜐ╘ˈheaderϢ᭄ᾬϬ”;”ẟᜐ╘ˈ᭄ПϬĀ˗āẟᜐ╘DŽHeaderϬߑ᭄osip_uri_parse_headersẟᜐᵤˈ඗ᄬ೼osip_uri_tᵘЁՈurl_headersЁ˗parameterϬߑ᭄osip_uri_parse_paramsẟᵤˈ݊඗ᄬ೼osip_uri_t Ոurl_paramsЁDŽ೼from ǃto ǃcontact ਍ࣙ৿url ՈheaderЁˈབurlЁࣙ৿parameterˈ߭ϾurlϬĀ<āĀ>āᴹˈҹϾurlDŽ᠔ҹᢧᵤfrom ਍headerᯊ◄ᰃ৺ࣙ৿”<”৪DŽ .3.4ϾᮄՈणᩲheader1)ϾϔϾᇍ᪩ẟᜐᵤՈ᭛ˈ2)ࣙ৿ϾheaderϬࠄՈ޴ϾᴀϬ᪡԰ˈ3)བ᪩headerĽ⅞Ոˊˈ4)ּ݇Ո໘ˊߑ᭄ˈ5)6)Ўosip_xxx.c ੠osip_xxx.h7)೼parser_initЁ⊼ՈheaderՈᢧᵤߑ᭄ˈ8)static__osip_message_config_t pconfig[NUMBER_OF_HEADERS]ЁՈNUMBER_OF_HEADERS ؐDŽ9)೼osip_const.hЁ⏏ՈheaderՈˈ10)osipՈּ݇Ո೼᪩11)೼osip_message.cosip_message_initߑ᭄Ё⏏ᇍ᪩headerּ݇ᵘՈ߱࣪᪡԰DŽ೼osip_message_freeߑ᭄Ёৠ12)ᇍ᪩headerՈּ݇᪡԰ˈ13)೼osip_message_cloneЁ⏏ᇍ᪩headerՈcloneּ݇᪡԰DŽ14)೼osip_message_to_str.cЁՈ_osip_message_to_strߑ᭄Ё⏏᪩header࣪ЎstringՈߑ᭄⊼DŽ15)བ᪩headerϡ16)ₑ17)Ͼߎɴˈ18)ेϡ19)multiple headerˈ20)߭೼osip_message_parse.cՈ osip_message_set_multiple_headerߑ᭄Ё⏏ᇍ᪩headerՈ໘ˊDŽ21)೼osip_message.hՈ༈ЁՈosip_messageᵘЁ⏏ᇍ᪩headerՈ඗ᵘDŽ22)೼osip_headers.hЁ⏏ՈheaderՈ༈ϬDŽ .4osip ՈtransactionՈ੥transaction Ո᪡԰Џࣙᣀtransaction Ո߱࣪ǃtransaction Ոfree ǃtransactionՈǃҢtransactionЁቻᙃ੠᪂าtransactionᙃDŽsipणᩲẴϔϾtransaction ϵ5Ͼᖙ˖from ǃto ǃtopviaǃcall-id ੠cseqˈẝ5ϾᾬϾtransactionˈབˈ᪩transactionาDŽ᠔ҹᇍ↣ϾᾬՈ᪂าϾ᪂าߑ᭄˖__osip_transaction_set_topvia Ϭาtopviaˈᇍথễ঳topviaЎՈviaˈᇍ঳topviaЎᇚmessageথࠄՈ᳔Ͼsip-proxyࡵ఼ˈ__osip_transaction_set_fromϬาmessageՈথễ঳ˈ__osip_transaction_set_toϬาmessageՈ᥹঳ˈ__osip_transaction_set_call_idϬาϾdialogՈؐˈ᪩ؐᰃՈˈᯊⒸݙϣՈcal_idᰃϡּৠՈˈ__osip_transaction_set_cseqϬาcseqؐˈ᪩ؐ೼ৠϔϾdialogݙᾬᰃϔՈˈेৠϔϾdialogՈՈtransaction Ոcseq↨ࠡՈtransaction Ոؐˈᣝsipणᩲ݊ؐৃҹᰃ᭄ˈҷɴЁབᰃregisterˈҢ1ˈབᰃregisterՈdialogˈҢ20DŽTransactionՈ߱࣪থϣ೼᥹ࠄϔϾᮄՈ᪻៪থễϾ᪻Ոᯊ׭ˈ᪩ҹঞẋᢧᵤ៤ЎϔϾৃҹָϬ᪻ᙃՈ඗ᵘosip_message_tDŽ݊߱࣪ẋ࣏བϞ᠔Ẵˈ೼᪂า5Ͼᾬˈẜ࣪eventՈⓣˈҹঞḍosip_message_t Ոtype ࣪ՓϬࠄՈᅮᯊ఼ᵘˈབICT Ոict_contextDŽ݊ᅗՈ߱࣪೼exosip Ёᅲɴˈּ݇Ոབyour_instance ǃin_socket ǃout_socket ੠recordᰃexosipЁᇍtransactionՈ੥ˊ໐᪂าՈDŽTransaction ЁՈeventՈּ݇᪡԰೼བ᠔ẴDŽ೼transactionՈЁˈḍRFC3261Ո᳔sipणᩲՈᦣẴˈϵtopviaՈbranch_idᰃ৺ּৠᴹˈབּৠˈህᰃৠϔϾtransactionՈ᪻੠ᑨਘঞACKˈЎᆍᴀՈtransactionՈ߭ˈৠᯊcall_id, cseq, from_tag, to_tag ᴹtransactionDŽབϟ೒ˈЎˊՈtransactionˈ᠔᳝Ոtransaction೼osip_tᵘՈЁˈᣝˊՈϡৠߚЎথễՈINVITE੠ᑨਘǃ݊ᅗ੠ᑨਘˈ᥹ࠄՈINVITE੠ᑨਘǃ݊ᅗ੠ᑨਘDŽstruct osip {void *application_context; /**< User defined Pointer */ /* list of transactions for ict, ist, nict, nist */osip_list_t osip_ict_transactions; /**< list of ict transactions */ osip_list_t osip_ist_transactions; /**< list of ist transactions */ osip_list_t osip_nict_transactions; /**< list of nict transactions */ osip_list_t osip_nist_transactions; /**< list of nist transactions */……#if defined(HAVE_DICT_DICT_H)dict *osip_ict_hastable; /**< htable of ict transactions */ dict *osip_ist_hastable; /**< htable of ist transactions */ dict *osip_nict_hastable; /**< htable of nict transactions */ dict *osip_nist_hastable; /**< htable of nist transactions */#endif };೼transactionՈẋ࣏ЁˈབᰃথߎՈ᪻ˈ಴ЎᴀഄՈtransactionϾϡₑՈtransaction_idˈ᠔ҹ↨‑transaction_idेৃ˗ᇍincoming Ոmessage,བᰃrequest ˈ߭ऍbranch_id៪ЎᆍᴀẟᜐtransactionՈ↨‑ˈᣝणᩲRFC3261Ո17-2-3Ոᮍẟᜐ˗བincoming Ոmessage ᰃresponseˈ߭ऍbranch_id៪ḍRFC3261Ո17-1-3Ոᢈ߭ẟᜐDŽ.5osip ЁdialogՈ੥dialogՈּ݇Ո੥ˊ᪡԰ࣙᣀdialogՈ߱࣪ᓎẋ࣏ˈdialogՈ⏄freeẋ࣏ˈҹঞdialogՈDŽ໪dialogЁᄬּ݇Ոϵᙃ੠cseqᙃDŽDialogᵘབϟˈϵcall_id ǃlocal_tag ੠remote_tagϾdialog˖struct osip_dialog {char *call_id; /**< Call-ID*/ char *local_tag; /**< local tag */ char *remote_tag; /**< remote tag */ osip_list_t route_set; /**< route set */ int local_cseq; /**< last local cseq */ int remote_cseq; /**< last remote cseq*/ osip_to_t *remote_uri; /**< remote_uri */ osip_from_t *local_uri; /**< local_uri */osip_contact_t *remote_contact_uri; /**< remote contact_uri */ int secure; /**< use secure transport layer */osip_dialog_type_t type; /**< type of dialog (CALLEE or CALLER) */state_t state; /**< DIALOG_EARLY || DIALOG_CONFIRMED || DIALOG_CLOSED */void *your_instance; /**< for application data reference */ };೼dialogՈ߱࣪ᯊˈ◄ᰃclient঳៪server঳ᴹdialogᵘЁՈcall_idǃlocal_tag ੠remote_tagՈؐDŽḍᰃclient঳៪server঳ᴹdialog ՈtypeˈาdialogՈDŽᔧخЎclient঳ˈᰃ೼᥹ࠄথߎՈrequest Ոresponseᯊˈ᫇Ϭosip_dialog_init_as_uacẟᜐ࣪dialog˗བᰃ᥹ࠄserver঳থễẋᴹՈrequestˈ߭Ϭosip_dialog_init_as_uac_with_remote_request ẟᜐdialogՈ߱࣪DŽབᰃserver঳ˈ᫇Ϭosip_dialog_init_as_uasẟᜐ࣪dialogDŽ೼dialogՈᯊˈᔧᰃclient঳ᯊˈ᫇Ϭosip_dialog_match_as_uacẟᜐDŽẔࠄՈresponse ੠dialogЁՈcall_id ˈto_tag ੠from_tagᰃ৺ˈབˈ߭ऍࠄњ᪩dialogDŽЎᆍՈᴀˈ೼dialog Ոto៪ࠄՈmessage Ոto headertagՈϟˈ↨ṇdialog ੠message Ոfrom_uri, to_uri DŽབˈ߭ৠḋՈdialogDŽᔧᰃserver঳ᯊˈ᫇Ϭosip_dialog_match_as_uasẟᜐDŽ݊Ϣclient঳ՈּৠDŽᇍfrom_tag ੠to_tagՈˊˈ೼transactionՈẋ࣏ЁৠḋϬࠄDŽ ExosipՈ⑤೼exosipࣙЁࣙ৿ˊϬՈ݇call ǃmessage ǃoption ǃreferǃregisterǃsubscription ǃpublish ੠insubscription ՈAPIˈẝѯAPIՈᅲɴ೼exՈcЁDŽЎẝѯ᥹ষẟᜐࡵՈߑ᭄ˈࣙᣀ੠osip libẟᜐՈᾬՈᅲɴ೼ҹjՈ⑤Ёབjcall.cˈ݊Ёjrequest.c ੠jresponse.cɴњrequest ੠response ՈmessageՈỞϬᵘɴDŽৠᯊexosipɴњՈϡৠՈՈsipणᩲẟᜐˈߚЎextl_dtls.c ǃextl_tcp.c ǃextl_tls.c ੠extl_udp.c ˈᅗҹ⊼Ոᮍ೼LibՈᯊ׭ࠄlibՈЁDŽЎњՈỞˈ೼ϸϾඃϬpipeՈᮍẟᜐɴˈབϬ໮ˈẝᾬ೼ᯊӮDŽᇍ᥹ࠄՈmessageẟᜐՈỿˊ೼᭛udp.cЁˈẝᾬᰃᭈϾणᩲ↨ṇ໡ᴖՈDŽ◄sipणᩲՈẴ੠ҷɴḚẟᜐˊՈDŽ.1LibՈ߱Ͼsip Ոlib ϾՈ੥ˊ඗ᵘstruct exosip_t eXosipˈ᪩೼libϬП࣪ˈ߱࣪ߑ᭄Ўexconf.cՈeXosip_initߑ᭄DŽExosip_tᵘབϟ˖ struct eXosip_tt{struct eXtl_protocol *eXtl;char transport[10];char *user_agent;eXosip_call_t *j_calls; /* my calls */#ifndef MINISIZEeXosip_subscribe_t *j_subscribes; /* my friends */eXosip_notify_t *j_notifies; /* my susbscribers */#endifosip_list_t j_transactions;eXosip_reg_t *j_reg; /* my registrations */#ifndef MINISIZEeXosip_pub_t *j_pub; /* my publications */#endif#ifdef OSIP_MTvoid *j_cond;void *j_mutexlock;#endifosip_t *j_osip;int j_stop_ua;#ifdef OSIP_MTvoid *j_thread;jpipe_t *j_socketctl;jpipe_t *j_socketctl_event;#endifosip_fifo_t *j_events;jauthinfo_t *authinfos;int keep_alive;int learn_port;#ifndef MINISIZEint http_port;char http_proxy[256];char http_outbound_proxy[256];int dontsend_101;#endifint use_rport;char ipv4_for_gateway[256];char ipv6_for_gateway[256];#ifndef MINISIZEchar event_package[256];#endifstruct eXosip_dns_cache dns_entries[MAX_EXOSIP_DNS_ENTRY];struct eXosip_account_info account_entries[MAX_EXOSIP_ACCOUNT_INFO];struct eXosip_http_auth http_auths[MAX_EXOSIP_HTTP_AUTH];CbSipCallback cbsipCallback;p_access_network_info *p_a_n_i; digest_cave_response *cav_v; };೼᪩ᵘЁˈ᳔ₑᡅՈ޴Ͼ៤བϟ˖1)int j_stop_ua;णᩲ੠ذՈࠊ᭄ˈ2)ᔧj_stop_ua Ў0ᯊˈ3)libˈ4)Ў0ᯊˈ5)libDŽ6)eXosip_call_t *j_calls; j_callsϬˊܼՈỞˈ7)᠔᳝Ոcall೼ẝϾ඗ᵘЁᔶϾᵘDŽCallᵘབϟ˖struct eXosip_call_t {int c_id;eXosip_dialog_t *c_dialogs; osip_transaction_t *c_inc_tr; osip_transaction_t *c_out_tr;int c_retry; /* avoid too many unsuccessfull retry */ void *external_reference;eXosip_call_t *next; eXosip_call_t *parent; };݊ЁՈc_id ЎߚՈcall_id ˈc_dialogs ЎৠϔϾcall ЁՈdialogՈ▊DŽc_inc_tr ੠c_out_tr Ў᪩call ᯊՈ߱࣪Ոtransaction ˈϔϾ঳ᇍϾcallϡᰃclient ঳ህᰃserver ঳ˈ᠔ҹc_inc_tr ੠c_out_tr Ͼᰃ᳝transactionՈˈ݊Ё᳝ϾЎNULL DŽ8)eXosip_reg_t *j_reg; j_regˊsip Ո⊼9)ࡵˈ10)᠔᳝register ּ݇Ոtransaction೼j_regЁᔶϾDŽḍsip णᩲˈ11)ՈϔՈ⊼਍ࠄẟᜐˈ12)᠔ҹৠ13)Ͼregisterϡ14)callˈৠ15)ᯊ᳝Ͼtransactionᄬ೼DŽ16)struct eXtl_protocol *eXtl;ЎՓϬՈՈणᩲˈ17)೼exosipՈ߱࣪Ё◄าˈ18)೼ɴ೼њ4ϡৠ19)Ոɴᮍˈ20)ՈᅲɴҹϔϾ඗ᵘՈᔶᄬ೼ˈ21)೼exosip_t࣪ᯊ⊼ࠄexosipՈextlЁDŽ22)osip_list_t j_transactions;ϬˊܼՈ┨ᰃẜಲՈtransactionDŽẝѯtransaction ϡ23)call ៪register៪ᰃcall ǃregisterЁ┨ՈtransactionDŽ24)osip_t *j_osip; Ўosip lib Ո੥ˊ඗ᵘˈ25)osip LibՈ඗ᵘ೼ϔϾӏࡵЁϾবᄬ೼ˈ26)ϬˊܼՈsip णᩲЁߎɴՈtransaction DŽḍՈᦣẴˈৠ27)Ͼtransaction ৠ28)ᯊᝯj_osip ˊ੠call/reg ˊˈ29)᠔ҹᔧϾtransaction ┨ᯊˈ30)Ңj_osip Ёᇚ᪩transactionҢ੥ˊ඗ᵘЁ┨ˈৠ31)ᯊҢcall ៪reg Ё┨ˈ32)ࠄj_transaction ЁDŽ೼j_osip ࣪ᯊˈ33)࣪њ4ϡৠ34)Ոtransaction Ո੥ˊˈৠ35)ᯊ߱࣪њmessage header Ոᢧᵤߑ᭄Ոܼˈ36)೼ߑ᭄increase_ref_countЁ߱࣪DŽৠ37)ᯊosip lib Ўњɴₑܹˈ38)ᇍᝯ࣪Ո⃵᭄ẟᜐ᭄DŽ39)ϟ☦ϾᄫϢणᩲՈᩨˈ40)೼registerᯊቻࠄᩨᙃˈ41)೼callᯊ◄ᇚᙃ⏏ࠄhttp_anth ៪proxy_anthЁҹ೼ẟᜐcallᯊ࿁ẋᩨDŽp_access_network_info *p_a_n_i; digest_cave_response *cav_v; jauthinfo_t *authinfos;struct eXosip_dns_cache dns_entries[MAX_EXOSIP_DNS_ENTRY];struct eXosip_account_info account_entries[MAX_EXOSIP_ACCOUNT_INFO];struct eXosip_http_auth http_auths[MAX_EXOSIP_HTTP_AUTH];42)೼OSIP_MTݙᾬՈᰃЎњ໐43)Ոֵোₓǃ⏅੠ඃՈỞՈpipe DŽ݊Ёpipeẋњˈ44)೼ିunixЁָϬpipe ˈ45)೼windowsЁ₋Ϭsocket ᴹpipeDŽ46)೼MINISIZEݙᾬՈЎᠽᴀˈ47)ᔧpublish ˈ48)notify਍ࡳ࿁ᯊˈ49)ҹਃϬDŽ࣪Ո⌕བϟˈेܼ߱࣪ˊবexosipՈ៤Ոؐ˖osip libmessage ᪡԰ǃ᥹message ᪡԰ǃtransaction Ոkill ᪡exosip Ёᇍtransaction ǃdialog ǃcall ǃregister਍Ոˈẝѯ᪡԰ϵՈexosip ˈ᠔ҹ೼ẟᜐẝѯ᪡԰ᯊӮಲexosip ೼osip ЁՈಲߑ᭄DŽ೼߱࣪exosipᯊӮẝѯಲߑ᭄ˈ೼eXosip_set_callbacksߑ᭄Ёᅲɴˈẝѯ⊼ߑ᭄Ոᅲɴ೼jcallback.c ЁᅲɴDŽexosip lib Ո⏄Ϭߑ᭄eXosip_quit ˈ݊᪡԰Ϣexosip_initՈ᪡԰ּˈ݊าj_stop_uaЎ0ˈՓˊඃˊsip णᩲՈrejister ੠call DŽ᠔᳝Ոݙᄬˈ₎exosipᄬՈ᠔᳝Ոcall ǃregister ੠ϬࠄՈdialog ঞtransactionDŽ೼exosipՈ߱࣪Ёˈᾬ੠Ϯࡵּ݇Ոᄫ೼exosip Ո໪ᾬẟᜐ࣪DŽབՈ߱࣪೼ߑ᭄eXosip_listen_addr ˈeXosip_masquerade_contactˈeXosip_set_user_agent ˈeXosip_add_authentication_info Ёᅲɴˈsip_reg.c Ոwinmain ˈ᪩ߑ᭄ᰃregister Ոਃߑ᭄ˈ࣪register ϬࠄՈ޴ϾؐˈSip_reg.c ᰃᇍlib ᑨϬՈϔϾDŽ.2LibՈЏ೼exosip lib ࣪៤ࡳПˈབϬ໮ˈ߭೼ᮄՈඃЁϔexosip_execute ˈ೼ЏЁᠻeXosip_automatic_action˗བϬ໮ˈ߭೼ऩЁ↣Ͼexosip libՈџˈexosip_execute ੠eXosip_automatic_action DŽ೼ЏЁ↣exosip LibࣙϞՈexEventˈ೼໘ˊexEvent ᯊӮˊcall Ё200ᑨਘՈₑথᴎࠊDŽ .2.12xxᑨਘՈₑথ໘ˊᴎࠊ೼eXosip_retransmit_lost200okЁᇍ2xxՈᑨਘẟᜐₑথࠊˈḍsipणᩲˈ಴Ў2xxՈₑᰃ◄sipणᩲẟᜐࠊՈˈᔧথễ2xxᑨਘˈ೼ᢈᯊⒸݙ≵ࠄACKᑨਘˈ߭ₑ2xxᑨਘDŽ݊ₑՈᯊⒸ╘Ў1sˈҹˈࠄ4࢖ᯊ↣╘Ў4sDŽ2xxՈₑথՈذথϣ೼ϸ˖ϔЎ2xxᑨਘথễᯊˈ೼থễ9ࠄᇍ঳থễՈACKᑨਘˈ߭ₑথˈcallՈỞɴՈњˈ߭᪩call˗Ў೼থễ2xxᑨਘПˈ᥹ࠄњᇍ঳ՈACKᑨਘˈ᪩ACKᑨਘẝϾdialogˈ߭া2xxՈথễˈৠᯊ₎dialogЁᄬՈ2xxᙃˈาdialogЁՈ2xxₑ᭄ЎذDŽ .2.2Exosip_executeexosip_executeՈᠻ↨ṇ੄ˈ಴Ў೼ඃteminateՈϟˈඃexosip_executeˈ᠔ҹ೼exosip_executeݙᾬּ݇Ո᪡԰ेৃDŽ݊བϟ˖eXosip_executeᯊˈmessageˈ᠔ҹẔᜐඃ࣏ϔָ೼֕਀ᰃ৺᳝থễՈmessage ˈᰃ੥ˊ࣏Ϭ᥹ᜐথễՈDŽ೼ˊ᥹Ոmessage ᯊৃ࿁Ոcall ǃᮄՈtransactionˈϣՈtransactionՈeventˈẜ᳝exosip ՈeventDŽ݊Ёexosip ՈeventᰃϞ᡹ඝ੥ˊ࣏Ոˈ೼੥ˊ࣏ЁḍՈᅲᜐ໘ˊDŽ݊࿁Ո৘eventՈᅮ೼᭛exosip.h Ոtypedef enumeXosip_event_type ЁDŽ೼ϔϾmessage ᑊخњˊП(гৃ࿁᳝ᮄՈmessageˊ)ˈexosip_execute ˊosip Ё4ᴵtransaction ⏂ᜬЁՈᅮᯊ఼ˈབᯊ఼ᯊˈ߭Ոᅮᯊ఼ᑊtransactionՈџЁˈ✊ৢᜐ4ᴵtransaction⏂ᜬЁՈ↣ϾtransactionՈџˈ݊ЁࣙᇍmessageՈˊDŽẝՈҷ೼osip lib᳝ߚDŽ೼໘ˊϞ☦ˈᓔՈcall ǃregistration ੠publicationDŽ݊Ё೼registration ੠publicationՈ₎Ոᯊ׭ˈᰃ݊ЁՈtransation Ңregistration ੠publicationՈЁߴ┨ˈ✊ৢ೼exosipՈj_transaction ⏂ᜬЁDŽ᪩⏂ᜬЁՈtransaction೼eXosip_release_terminated_callsЁ₎DŽৠᯊˈབሖՓϬՈᰃUDPˈ߭Ϭ_eXosip_keep_alive ЎregistrationথUDP ՈỞˈUDPᯊ᪩঳ষDŽ .2.2.1Exosip_read_messageExosip_read_message ϬՈሖणˈ᫇ϬሖՈtl_read_message ҢTCP/IP ሖmessage DŽབҢሖmessage ˈ߭Ѹඝ_eXosip_handle_incoming_message ᜐ໘ˊDŽ೼_eXosip_handle_incoming_messageЁˈ᪩message ˈབˈ೼ᢧˈẔmessage ЁՈᖙᡅcall_id number DŽབ੥ˊ࣏೼exosip Ё⊼њmessageՈˊˈ߭ಲ᪩ߑDŽ✊message ՈିˈẔᑊܲ᪩message ՈѻՈtransaction ՈeventՈିˈ಴Ўᰃ᥹message ˈ᠔ҹିЎRCV_XXX ˈ೼থễmessage ᯊˈѻSND_XXXՈevent DŽ಴ЎᰃᮄՈmessage ˈ᳝ৃ࿁ˈϔᰃ࿁೼ՈtransactionˈेᰃᶤϾ᪻∖Ոᑨਘ៪ACK ˗བϡ࿁ˈḍmessage ЁՈᗕˈབᰃ0,ᰃϔϾ∖ˈ໐ϨϾ᪻∖ϡ࿁೼Ոtransactionˈ᠔ҹᰃϔϾᮄ∖ˈᇍᮄ∖Ո໘ˊ೼eXosip_process_newrequest Ё˗བstatus ϡЎ0ˈ߭ᰃϔϾresponse ˈ಴Ўresponse ᰃᇍϔϾrequest Ոಲˈ໐থễrequest Ոᯊ׭೼঳এњᮄՈtransactionˈབˊˈ᪩response ᪩ऍϔϾ೼Ոtransactionˈɴ೼≵᳝ˈ᪩response ᰃϔϾ᪳থễՈresponse ˈᇍresponse Ո໘ˊ೼eXosip_process_response_out_of_transaction ЁDŽExosip_read_messageՈ໘ˊ⌕࣏བ˖eXosip_process_newrequesta)message b)ctx_type c)d)ҹ঳Ўserver ˈe)message ᮶ϡf)ᰃINVITE ˈg)гϡh)ᰃACK ˈৠi)ᯊϡj)ᰃ݊ᅗREQUEST Ոˈk)ָ߭᥹Ͼmessage DŽl)ᰃACK ˈm)ཱི߭ᰃᇍ200Ոresponse ՈϔϾಲDŽϡn)এՈtransaction DŽo)ᰃCANCEL ˈp)ָ߭᥹eXosip_process_cancel ᜐ໘ˊDŽq)᪩message ᰃ৺ѢϔϾdialog ˈr)಴Ўdialog transactionՈᴵӊਘˈs)Ͼtransaction ৃҹѢৠt)ϔϾdialogDŽབϔϾdialog ˈu)߭᪩Ոmessage Ոcseq_number ੠dialog ЁՈcseq_number Ո໻ᇣˈv)᳝໻Ѣdialog ЁՈremote cseq number ˈw)Ոmessage ᰃϔϾ᪳Ոrequest ˈx)߭᪩messageᑊẘಲDŽy)ᰃINVITEᑊϨ᳝ᅮ᪩Ոˈz)߭ܜথễϔϾ100ՈᯊᑨਘDŽaa)ϾmessageϔϾdialogi.ᑊϨϡii.ᰃACK੠BYEˈiii.߭Ͼdialogᰃ৺Ꮖˈiv.᮶᪩dialogথễ៪᥹BYE∖ˈv.߭sipᷛvi.ޚথễϔϾ481Ո᪳ᦤਘDŽvii.ϡviii.ᰃACK ˈix.಴ЎᏆՈড়ˈৠx.ᯊϔϾdialog ˈxi.᠔ҹ◄᪩messagedialog Ոremotecseq DŽxii.message ᰃINVITE1.ϾdialogЁ᳔ՈϔϾ᥹ՈINVITE ᰃ৺Ꮖᗕˈ2.᳝ˈ3.߭sipᷛ4.ޚᇚϾnew INVITEߴ┨ˈ5.ᑊথễϔϾ500Ոᦤ᪳ਘDŽ6.Ͼdialog Ё᳔ՈϔϾথễՈINVITE ᰃ৺Ꮖᗕˈ7.᳝ˈ8.߭sipᷛ9.ޚᇚϾnew INVITEߴ┨ˈ10.ᑊথễϔϾ491Ոᦤ᪳ਘDŽ11.৺߭᪩INVITE ᰃϾড়Ո᪻∖ˈ12.߭᳈dialog Ոroute set ˈ13.಴Ў᪩INVITE ᑊϡ14.ᰃ߯᪩dialog ՈৰϔϾ᪻∖ˈ15.᠔ҹ᫇ϬeXosip_process_reinviteˊ᪩INVITE∖DŽxiii.message ᰃBYE ∖1.᪩BYE ∖Ոˈ2.ᰃ৺ࣙto tag ˈ3.಴Ў঳থՈresponse ᳝to tag ˈ4.᠔ҹᇍ঳থễՈBYE᪩ᰃϔϾࣙto tag Ոড়ՈmessageDŽ5.dialog Ёᰃ৺ᏆBYE ˈ6.BYEˈ7.ᇍᮍথњBYE ∖ˈ8.ָ᥹ಲ໡9.500᪳ᦤਘ10.৺߭ϬeXosip_process_bye ˊBYE ∖DŽxiv.ᰃACK ˈxv.ָ᥹ϬeXosip_process_ack ˊ᪩ACK ∖xvi.ᰃ݊ᅗ∖ˈxvii.߭ϬeXosip_process_message_within_dialogˊ᪩∖DŽbb)৺߭ˈcc)᳝ϔϾdialog ˈdd)ᰃܼՈϔϾ᪻∖i.ᰃACK ˈii.᪩200ՈACK ᳝dialog ˈiii.᠔ҹᰃϔϾ᪳ՈACK ˈiv.ָ᥹message ेৃˈv.಴ЎᰃACK ˈvi.᠔ҹᑊ᳝ᓎএtransaction ˈvii.ϡviii.ᇍtransaction ᜐ᪡DŽix.ᰃINFO ˈx.ָ᥹ಲ໡xi.481ਘDŽxii.ᰃINVITE ˈxiii.ϬeXosip_process_new_inviteˊẝϾᮄ∖ˈxiv.᪩∖ড়ˈxv.߭ϔϾᮄՈcall ˈxvi.ᑊϨ೼callϞϣϔϾdialog ˈxvii.᪩dialog ᰃ᳡xviii.঳Ոdialog ˈxix.಴Ў঳ᰃUAS DŽxx.ᰃBYE ∖ˈxxi.߭੠ACK ϔḋˈxxii.᪩BYE ∖≵᳝dialog ˈxxiii.ಲ໡xxiv.ϔϾ481Ո᪳ᦤਘỞᇍ঳◄Ոdialog ϡxxv.೼DŽxxvi.ᰃ݊ᅗ∖ˈxxvii.߭಴Ўᰃϡxxviii.sip ᷛxxix.ޚՈ᪻∖ᮍˈxxx.᠔ҹՈtransactionߴ┨ՈⓣЁेৃDŽ.2.2.2eXosip_process_response_out_of_transaction˖a)಴Ўmessage Ўᑨਘˈ໐b)Ϩ᳝transaction ˈc)᠔ҹᰃϔϾ᪳ՈᑨਘDŽmessage Ոড়ˈd)ϡe)ˈf)ָ᥹ᑊẘಲg)᠔ҹՈcall Ոdialog ˈh)᪩responseᰃ৺dialog៪ᰃẜ᳝ᓎএdialog Ոcalli)᳝ϔϾcall ˈj)᪩response Ϣcallˈk)ָ᥹DŽl)#ifndef MINISIZE ˈm)ϨऍϔϾdialog ˈn)o)њ200ਘˈp)ৃ࿁಴ᰃᇍᮍ᳝᥹঳থễՈACKˈq)ᰃ঳Ոtransaction ೼᥹200ਘᯊᏆkillњˈr)᠔ҹ≵᳝transaction ˈs)ᰃњdialogDŽབ200ਘՈcseq੠঳থễՈcseq Ոnumber ਍ˈt)߭থễACKਘDŽ໘ˊϞẴˈu)᪩messageᑊẘಲDŽv)ᰃњcall ˈw)dialog ᳝ᓎএˈx)ᰃඝ200ਘᰃϔϾ᪳Ոᑨਘˈy)৺߭call Ոc_out_tr transactionDŽ߭Ў᪩200ਘᯊᓎএϔϾdialogᑊথễACKಲˈz)✊ৢথễϔϾBYE∖඗᪩call ˈaa)಴Ў᪩callথễ᪳њDŽ.2.3eXosip_automatic_action ˊ⌕࣏᪩ߑϬѢˊાՈcall ǃregisterǃnotify ǃpublish਍ˈ೼᥹ಲЎ401៪407៪◄থՈˈẟᜐₑDŽa)᠔᳝Ոcall:i.c_id < 1߭ϡii.Ϭ໘ˊˈiii.call ՈidѢ1Ոᰃᝯߴ┨Ոᰃ᳝ᝯˊߎj_calls⏂ᜬՈcallDŽiv.᪩call Ոdialog᳝ᓎএ᰻ˈv.ᰃ঳থễϔϾINVITE∖ᓎএՈᮄcall ˈvi.ᰃᇍ঳থễՈৰϔϾINVITE ˈvii.߭ᴀ঳ಲϔϾresponse ˈviii.೼ಲresponseՈᯊ׭ˈix.dialogህᝯএњDŽ1.এ᪩callՈৰϔϾINVITE ∖ᓎএ᰻ՈtransactionՈᗕˈ2.ˈ3.ᑊϨ᪩call᳝ࠄᯊᯊⒸ120࢖ˈ4.ϨՈಲ໡ 5.ՈᗕЎ401៪407ˈ6.߭থễ∖ˈ7.ᑊϨҢಲ໡8.ЁᦤপDŽₑথ⃵᭄Ў3⃵ˈ9.3⃵ˈ10.߭਍ָࠄ᪩callᯊ඗DŽৠ11.Ϟˈ12.ಲ໡13.ਘՈstatus Ў[300, 399]ˈ14.߭থễ∖ˈ15.ᑊϨḰথễՈˈ16.17.থễ⃵᭄гЎ3⃵DŽẝϬ_eXosip_call_retry_request ᜐ໘ˊDŽx.call Ё᠔᳝Ոdialog ˈxi.ᇍѢdialog೼Ոdialog ᜐ໘ˊˈxii.ˊᮍৠxiii.Ϟˈxiv.гᰃẔˈxv.ϔЎᑨਘstatus Ў401៪407Ոᩨ᪳ᦤˈxvi.ϔЎ[300, 399]server঳ՈথᦤDŽb)᠔᳝Ոregister ˈc)ˊr_id >=1 Ϩ᳝transaction Ոregister ˈd)r_id < 1៪᳝last transaction Ոregister ᰃᏆߴ┨Ոregister ˈe)ϡf)ˊDŽi.থᯊⒸϡii.Ў0ˈiii.᮶᪩registerϔָₑথễˈiv.ϨᯊⒸᯊˈv.᪩registerҢ⊼೼Ꮖ900࢖ˈvi.߭ϬeXosip_register_send_registerᜐₑDŽvii.ᯊⒸ೼Ў໻ѢՈₑᯊⒸ-60࢖ˈviii.гথˈix.᮶њₑᯊⒸˈx.ᖙ◄೼ₑᯊՈ60࢖ህᓔথDŽxi.៪ˈ໐xii.ϨࡿϞ⃵⊼ᯊⒸ120࢖ˈxiii.ᑊϨ᳝᥹xiv.Ոᑨਘ៪ਘϡxv.ᰃ៤Ոᑨਘˈxvi.߭гথDŽxvii.ˈxviii.ेৰϔ⃵⊼ˈxix.Ϩᰃ಴Ўᩨ໐xx.Ո⊼ˈxxi.߭DŽབᰃWPDIF ˈxxii.߭ಲ໡xxiii.ЁՈᩨnonceᰃ৺੠Ϟϔ⃵ᯊՈnonce ּؐৠˈxxiv.ৠxxv.߭থ˗ϡxxvi.ᰃWPDIF ˈxxvii.ָ߭᥹থDŽЎњWPDIFՈ៤ˈxxviii.೼ৰϔ⃵⊼ᯊˈxxix.ᦤ⃵᳡xxx.঳Ոಲ໡xxxi.ЁՈnonceؐˈxxxii.ҹ೼ᰃ৺থՈᯊ׭ᴵӊЎDŽg)Notify ǃsubscription ǃpubՈ໘ˊৠh)callDŽ.3Call೼exosip libЁ┨њϔָ೼ẔᜐՈ໘ˊᇍ঳থễՈmessageՈඃ࣏໪ˈẜᦤկњ঳Ўথễ঳থễrequest ǃACK DŽ಴Ў᠔᳝Ոmessage ѢϾtransaction ˈ໐ϨᇍmessageՈ໘ˊ᳔೼transaction Ոevent Ёẟᜐ໘ˊˈ᠔ҹ᠔᳝ᦤկՈࣙcall ǃnotify ǃpublish ǃregister ǃsubscription ǃrefer ਍ࡳᰃỞϔϾtransaction ϞՈeventϢϔָẔᜐՈ໘ˊඃ࣏ᜐˈevent ˈ໘ˊඃ࣏೼Ḳ᠔᳝transaction ᯊӮˊࠄeventˈϾevent এे໘ˊՈᯊ׭ˈ߭ৃҹeventՈ໘ˊඃ࣏ˈ໐ϡ◄਍ࠄ᪩ˊඃ࣏ˊࠄ᪩transaction DŽExosip lib ᦤկњcall Ո4˖ৰϔ⃵ᓎএϔϾcall Ոinitial invite থễ˗೼dialog Ё߯থễՈ݊ᅗrequest ˗೼dialog Ё߯থễᇍҢᇍ঳থễՈrequest Ոresponse ˗೼invite ∖Ёಲᇍ঳response ՈACK Ո߯੠থễDŽ .3.1CallՈৰϔϾINVITE೼excall_api.cЁՈeXosip_call_build_initial_invite ੠eXosip_call_send_initial_invite ᦤњ঳থϔϾᮄՈcallᯊՈ᥹DŽeXosip_call_build_initial_inviteՈ⌕࣏བ˖。

osip编译和使用

osip编译和使用

oSIP在windows下的安装和使用※oSIP协议栈的安装vc6.0下的osip2(在libosip2.3.0.1)的编译基本步骤如下:(1) 创建动态链接库工程,编译生成osipparser2.dll文件1、在d盘上新建一个osip文件夹d:\osip;2、把libosip2.3.0.1文件夹下的include文件夹整个拷到新建的d:\osip文件夹里;3、新建vc6.0工程,选择win32 dynamic-link library,project name命名为osipparser,location为d:\osip。

选择一个空的dll project。

4、然后Tools->options->Directories->include files设置如下:C:\PROGRAM FILES\MICROSOFT PLATFORM SDK\INCLUDEC:\Program Files\Microsoft Visual Studio\VC98\INCLUDEC:\Program Files\Microsoft Visual Studio\VC98\MFC\INCLUDEC:\Program Files\Microsoft Visual Studio\VC98\ATL\INCLUDED:\OSIP\INCLUDE(需要添加)5、project->settings->preprocessor difinitions中末尾添加“,osip_mt,_mt”,不要忘了逗号。

把category选为code generation,然后设置Use run-time library选为Debug Multithreaded DL。

6、进入libosip2.3.0.1文件夹,把libosip2.3.0.1\src\osip2\里面所有*.c和*.h文件拷到D:\osip\osipparser目录下, 即和*.dsw和*.dsp文件放一起;然后把.libosip2.3.0.1\platform\vsnet\osipparser2.def也放到这里。

sip性能优化

sip性能优化

由于工作的原因,需要对osip协议栈进行优化,前段时间在论坛上看到lw3223兄对于osip协议栈hash查找事务的讨论,鉴于此把自己这段时间对osip的优化和心得总结出来大家共享一下。

写的比较匆忙,有点乱,大家见谅了。

众所周知,Osip协议栈是用C语言编写,实现了SIP协议基于事务层的处理,后来作者对协议栈进行了扩展,提供了call级的操作处理,也就是eXosip。

Osip小巧,灵活,易扩展,比较方便用来实现UA,但是用作proxy的话性能上有点满足不了需求(听说有个改良版的partysip,没用过,我们这里只讨论osip 的优化),有必要对其进行优化一番。

这里使用的是最新3.0.1的版本,有些固有的影响性能的因素,比如消息的解析,复制,转换到字符串以及释放等暂不予讨论,大家有什么好的方案也可以一起讨论一下。

我们可以围绕协议栈线程主执行函数_eXosip_execute()来展开对它的优化工作。

1.1 SIP Message到transaction的映射Osip性能低下的一个重要原因便是有太多的for循环,尤其是在事务层SIP消息到事务的匹配,好在osip 预留了hash的处理方法,为我们的优化节省了不少的工作量。

打开编译宏HA VE_DICT_DICT_H,协议栈便会使用libdict库对四种事务进行hash的插入,查找,删除等。

如果您手头有这个库,到这里这一步就可以完成了。

由于这个库不是linux自带的,你可能需要自己给协议栈实现一个hash算法,增加osip_hash.c 和osip_hash.h两个文件基本上就OK了。

经过测试,这项操作对性能的提升约1/10左右。

由于测试的压力较小,因此查询效率的提升不是很明显,但是当呼叫量和并发数较大时,对性能的改善应该会比较明显。

1.2 Osip状态机的处理效率协议栈处理事务事件(这里指osip事件,非eXosip事件)的主函数是osip_xxx_execute(),在这里xxx 分别代表osip的四种状态机ict, ist, nict, nist,以下如未经特别说明均使用该准则。

exosip,osip学习篇(一)

exosip,osip学习篇(一)

exosip,osip学习篇(一)最近简单粗略地看了下Osip,eXosip,ortp等要应用Osip到我们的程序中去,首先要看官方文档,文档中对Osip协议栈提供的各个功能部件如何使用都有比较详细的描述,但未进行整体性的分析,某些中文的指导文档也都停留在对其简单的翻译,不能为不熟悉该协议栈使用的用户快速参考使用,本文档不按照Osip的代码进行按功能分块说明,而是根据实际使用时的代码使用顺序来对主要逻辑流程进行分析,并适当对流程中使用到的功能部件进行说明,具体更详细的功能说明或疑问可直接查看官方文档对应部分的解释或直接查看功能函数源代码即可解决。

第一步:了解exosip ,osip中一些基本知识先认识几个结构体:osip_t,osip_message_t,osip_dialog_t,osip_transaction_t;osip_t是一个全局变量,所有要使用Osip协议栈的事务处理能力的程序都要第一步就初始化它(相对应于只使用osipparser库进行SIP消息字段解析的应用来说,如果只使用parser库到自己的程序中,想必对SIP协议栈已经很熟悉了,不需再往下看了^_^),它内部主要是定义了Osip 协议栈的四个主要事务链表、消息实际发送函数及状态机各状态事件下的回调函数等;在程序中osip_t被定义为: struct osip{void *application_context; /**< User defined Pointer *//* list of transactions for ict, ist, nict, nist */osip_list_t osip_ict_transactions; /**< list of ict transactions */osip_list_t osip_ist_transactions; /**< list of ist transactions */osip_list_t osip_nict_transactions; /**< list of nict transactions */osip_list_t osip_nist_transactions; /**< list of nist transactions */osip_list_t ixt_retransmissions; /**< list of ixt elements */osip_message_cb_tmsg_callbacks[OSIP_MESSAGE_CALLBACK_COUNT]; /**@int ernal */osip_kill_transaction_cb_tkill_callbacks[OSIP_KILL_CALLBACK_COUNT]; /**@internal */ osip_transport_error_cb_ttp_error_callbacks[OSIP_TRANSPORT_ERROR_CALLBACK_COUN T]; /**@internal */int (*cb_send_message) (osip_transaction_t *, osip_message_t *, char *,int, int);/**@internal */#if defined(HAVE_DICT_DICT_H)dict *osip_ict_hastable; /**< htable of ict transactions */dict *osip_ist_hastable; /**< htable of ist transactions */dict *osip_nict_hastable; /**< htable of nict transactions */dict *osip_nist_hastable; /**< htable of nist transactions */#endif};typedef struct osip osip_t;osip_message_t是SIP消息的C语言结构体存储空间,收到SIP 消息解析后存在该结构中方便程序使用接收到的消息中的指定的字段,发送消息前为方便设置要发送的字段值,将要发送的内容存在该结构中等发送时转为字符串;在该文档中提供了大量的API来对消息进行处理。

oSIP协议桟浅析

oSIP协议桟浅析

oSIP协议栈浅析1. oSIP介绍 (1)2. oSIP结构分析 (1)2.1 oSIP结构 (1)2.2 状态机(Finite State Machines)模块 (2)2.2.1 概述 (2)2.2.2 ICT状态机 (3)2.2.3 NICT状态机 (4)2.2.4 IST状态机 (5)2.2.5 NIST状态机 (6)2.3 解析器(Parsers)模块 (7)2.3.1 SIP Parser (7)2.3.2 SDP Parser (9)2.3.3 URL Parser (10)2.4 工具(Facilities)模块 (11)2.4.1 SDP negotiator (11)2.4.2 Dialog management (11)3. oSIP特点 (11)3.1 oSIP的优点 (11)3.2 oSIP的缺点 (12)4. oSIP应用结构图 (12)5. oSIP使用概述 (13)5.1 初始化oSIP (13)5.2 注册CALL BACK函数 (13)5.3 Transaction操作 (15)6. 参考 (15)1. oSIP介绍oSIP是按照RFC3261(SIP)和RFC2327(SDP)标准,并使用标准c编写的一个SIP协议栈。

它是一个公开源码的免费协议栈。

oSIP协议栈结构简单而小巧,它并不提供高层的SIP会话控制的API,它主要提供一些解析SIP/SDP消息的API 和事务处理的状态机。

oSIP支持线程安全,既可以用于多线程的编程模式,也可以用于单线程的编程模式;oSIP可以用来开发User Agent,IP soft-phone和SIP Proxy等等。

oSIP目前最后版本为V 0.9.7,不久oSIP版本将升级至oSIP2(V 1.99.7)。

oSIP2主要调整了一些函数和结构名称,以及一些头文件的名称、内容结构的调整,整体的构架和功能不变。

本文以下描述都基于oSIP V0.9.6版本。

vector sip工程编译

vector sip工程编译

vector sip工程是指使用SIP(System Integrity Protection)机制的工程,它是macOS操作系统中的一项安全功能,用于防止用户或应用程序修改系统文件。

SIP工程在编译时需要进行特定的配置和操作,以确保系统文件的完整性。

以下是编译SIP工程的一般步骤:打开Xcode并打开SIP工程。

在Xcode的工程设置中,确保选择正确的目标(Target)和配置(Configuration)。

通常情况下,你会选择"macOS"作为目标平台。

在"Build Settings"选项卡中,查找"System Integrity Protection"选项,并确保它被选中。

该选项确保在编译过程中使用SIP功能。

在"Build Phases"选项卡中,检查是否有"Run Script"阶段。

如果有,确保该阶段在编译过程中执行,并且包含必要的SIP配置命令。

这些命令通常包括禁用SIP的命令,例如sudo /usr/bin/csrutil enable --without diags。

点击"Build"按钮进行编译。

在编译过程中,Xcode将执行SIP配置命令,并生成可执行文件或库文件。

编译完成后,你可以在Xcode的"Products"导航器中查看生成的可执行文件或库文件。

这些文件已经经过SIP配置,可以在macOS系统上运行。

需要注意的是,SIP工程在编译时需要禁用SIP功能,以确保编译过程的正确性。

在完成编译后,你需要重新启用SIP功能,以确保系统的安全性。

VoIP技术与Linphone编译

VoIP技术与Linphone编译

20.3.1 ICT(Invite Client (outgoing) Transaction)状态机
在libosip源码目录下的ICT状态机文件为ict_fsm.c,数 组ict_transition[11]给定了各个状态接收事件的各种事务处 理情况。
20.3.2 NICT(Non-Invite Client (outgoing) Transaction)状态机
20.3.4 NIST(Non-Invite Server (incoming) Transaction)状态机
NIST状态机整个实现过程在nist_fsm.c文件中定义,在 数组transition_t nist_transition[10]中定义了状态机的初始状 态以及初始状态接收的事件,各个事件函数表示了状态机处 理该事件的跳转情况。
函数osip_body_to_str()与函数osip_body_parse()对应, 用于将body中的body字段的内容复制到参数dest中。
20.4.5 克隆函数osip_body_clone()
函数osip_body_clone()将body复制给dest。
20.4.6 oSIP解析器分类
20.5 oSIP事务层
SIP是一个基于事务处理的协议:部件之间的交互是通 过一系列的消息交换所完成的。特别是,一个SIP 事务由一 个单个请求和这个请求的所有应答组成,这些应答包括了零 个或者多个临时应答以及一个或者多个终结应答。
20.6 SIP建立会话的过程
下面采用序列图的方式表示A和B两个用户间的通过SIP 消息交换来建立会话的过程。A通过B的SIP标志“呼叫”B, 这个SIP标志是统一分配的资源(Uniform Resource Identifier URI)称作SIP URI。它很像一个email地址,典型的SIP URI 包括一个用户名和一个主机名。在这个范例中,SIP URI是 sip:bbb@,是B的SIP服务提供商。A有 一个SIP URI: sip:aaa@。

osip编译和使用

osip编译和使用

oSIP在windows下的安装和使用※oSIP协议栈的安装vc6.0下的osip2(在libosip2.3.0.1)的编译基本步骤如下:(1) 创建动态链接库工程,编译生成osipparser2.dll文件1、在d盘上新建一个osip文件夹d:\osip;2、把libosip2.3.0.1文件夹下的include文件夹整个拷到新建的d:\osip文件夹里;3、新建vc6.0工程,选择win32 dynamic-link library,project name命名为osipparser,location为d:\osip。

选择一个空的dll project。

4、然后Tools->options->Directories->include files设置如下:C:\PROGRAM FILES\MICROSOFT PLATFORM SDK\INCLUDEC:\Program Files\Microsoft Visual Studio\VC98\INCLUDEC:\Program Files\Microsoft Visual Studio\VC98\MFC\INCLUDEC:\Program Files\Microsoft Visual Studio\VC98\ATL\INCLUDED:\OSIP\INCLUDE(需要添加)5、project->settings->preprocessor difinitions中末尾添加“,osip_mt,_mt”,不要忘了逗号。

把category选为code generation,然后设置Use run-time library选为Debug Multithreaded DL。

6、进入libosip2.3.0.1文件夹,把libosip2.3.0.1\src\osip2\里面所有*.c和*.h文件拷到D:\osip\osipparser目录下, 即和*.dsw和*.dsp文件放一起;然后把.libosip2.3.0.1\platform\vsnet\osipparser2.def也放到这里。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

OSIP协议栈(及eXoSIP,Ortp等)使用入门-- 第一阶段发布: 2009-6-22 10:03 | 作者: deep3gadmin | 查看: 8次Linux下oSIP的编译使用应该是很简单的,其Install说明文档里也介绍的比较清楚,本文主要就oSIP在Windows平台下VC6.0开发环境下的使用作出描述。

虽然oSIP的开发人员也说明了,oSIP只使用了标准C开发库,但许多人在Windows下使用oSIP时,第一步就被卡住了,得不到oSIP的LIB库和DLL库,也就没有办法将oSIP使用到自己的程序中去,所以第一步,我们将学习如何得到oSIP的静态和动态链接库,以便我们自己的程序能够使用它们来成功编译和执行我们的程序。

第一阶段:------------------------------------------------------先创建新工程,网上许多文档都介绍创建一个Win32动态链接库工程,我们这里也一样,创建一个空白的工程保存。

同样,将oSIP2版本3.0.1 src目录下的Osipparser2目录下的所有文件都拷到我们刚创建的工程的根目录下,在VC6上操作:Project-AddToProject-Files将所有的源程序和头文件都加入到工程内,保存工程。

这时,我们可以尝试编译一下工程,你会得到许多错误提示信息,其内容无非是找不到osipparser2/xxxxx.h头文件之类。

处理:在Linux下,我们一般是将头文件,lib库都拷到/usr/inclue;/usr/lib 之类的目录下,c源程序里直接写#include <xxx.h>时,能直接去找到它们,在VC里,同样的,最简单的方法就是将oSIP2源码包中的Include目录下的 osipparser2目录直接拷到我们的Windows下默认包含目录即可,这个目录在VC6的Tool-Options-Directories里设置,(当然,如果你知道这一步,也可以不用拷贝文件,直接在这里把oSIP源码包所在目录加进来就可以了),默认如果装在C盘,目录则为 C:\Program Files\Microsoft Visual Studio\VC98\Include。

这时,我们再次编译我们的工程,顺利编译,生成osipparser2.dll,这时,网上很多文档里可能直接就说,这一步也会生成libs目录,里面里osipparser2.lib文件,但我们这里没有生成:)最简单的方法,不用深究,直接再创建一个工程,同上述创建动态链接库方法,创建一个Win32静态链接库工程,直接编译,即可得到osipparser2.lib。

------------------------------------------------------上面,我们得到了Osip的解析器开发库,下面再编译完整的Osip协议栈开发库,同样照上述方法,分别创建动态链接库工程和静态链接库工程,只是要拷的文件换成src下的osip目录下文件和include下的osip目录,得到osip2.dll和osip2.lib。

在编译osip2.dll这一步可能会再次得到错误,内容含义是找不到链接库,所以,我们要把前面编译得到的osipparser2.lib也拷到osip工程目录下,并在VC6中操作:Project-Setting-Link中的Object/LibraryModules:kernel32.lib user32.lib ... xxx.lib之类的内容最后增加: osipparser2.lib 保存工程后再次编译,即可成功编译osip2.dll。

------------------------------------------------------至此,我们得到了完整的oSIP开发库,使用时,只需在我们的程序里包含oSIP的头文件,工程的链接参数里增加osipparser2.lib和osip2.lib即可。

------------------------------------------------------下面我们验证一下我们得到的开发库,并大概了解一下OSIP的语法规范。

在VC里创建win32控制台程序工程,将libosip源码包的SRC目录下的Test目录内的C源程序随便拷一个到工程时,直接编译(工程设置里照前文方法在link选项里增加osip2.lib,osipparser2.lib引用我们之前成功编译得到的静态库文件)就可以运行(带参数运行,参数一般为一个文本文件,同样从Test目录的res目录里拷一个与源文件同名的纯文本文件到工程目录下即可)。

该目录下的若干文件基本上是测试了Osip的一些基本功能函数,例如URI解析之类,可以大概了解一下oSIP的语法规范和调用方法,同时也能校验一下之前编译的OSIP开发库能否正常使用,成功完成本项工作后,可以进入下一步具体的oSIP的使用学习了。

------------------------------------------------------由于oSIP是比较底层的SIP协议栈实现,新手较难上手,而官方的示例大都是一些伪代码,需要有实际的例子程序参考学习,而最好的例子就是同样官方发布的oSIP的扩展开发库exosip2,使用exoSIP可以很方便地快速创建一个完整的SIP程序(只针对性地适用于SIP终端开发用,所以我们这里只是用它快速开发一个SIP终端,用来更方便地学习oSIP,要想真正掌握SIP的开发,需要掌握oSIP并熟读RFC文档才行,exoSIP不是我们的最终学习目的),通过成功编译运行一个自己动手开发出的程序,再由浅入深应该是初学都最好的学习方法通过对使用exosip开发库的使用创建自己的SIP程序,熟悉后再一个函数一个函数地深入学习exosip提供的接口函数,就可以深入理解osip 了,达到间接学习oSIP的目的,同时也能从eXoSIP中学习到正确使用oSIP的良好的编程风格和语法格式。

而要成功编译ExoSIP,似乎许多人被难住了,直接在XP-sp2上,用VC6,虽然你使用了eXoSIP推荐的winsock2.h,但是会得到一个 sockaddr_storage结构不能识别的错误,因为vc6自带的开发库太古董了,需要升级系统的PlatformSDK,下载地址如下:/msdownl ... PSP2FULLInstall.htm(VC6的支持已经停止,这是VC6能使用的最新SDK)成功安装后编译前需加OSIP_MT宏,以启用线程库,否则在程序中使用eXoSIP库时会出错,而编译时也会得到许多函数未定义的Warning提示,编译得到exosip2.lib供我们使用,当然,在此之前需要成功编译了osip2和osipparser2,而在之后的实际使用时,发现oSIP也需要增加OSIP_MT宏,否则OSIP_MT调用oSIP的线程库时会出错,所以我们需要重新编译oSIP了:),因为eXosip是基于oSIP的(同上方式创建静态和动态链接库工程,并需在Link中手工添加oSIP和oSIPparser的lib库)。

------------------------------------------------------创建新工程,可以是任意工程,我们从最简单的Win32控制台程序开始,为了成功使用oSIP,我们需要引用相关库,调用相关头文件,经过多次试验,发现需要引用如下的库:exosip2.lib osip2.lib osipparser2.lib WSock32.Lib IPHlpApi.LibWS2_32.Lib Dnsapi.lib其中,除了我们上面编译得到的三个oSIP库外,其它库都是系统库,其中有一些是新安装的PlatformSDK所新提供的。

至此,我们有了一个简单的开发环境了,可以充分利用网上大量的以oSIP为基础的代码片段和官方说明文档开始具体函数功能的测试和使用了:)------------------------------------------------------我们先进行一个简单的纯SIP信令(不带语音连接建立)的UAC的SIP终端的程序开发的试验(即一个只能作为主叫不能作为被叫的的SIP软电话模型),我们创建一个MFC应用程序,对话框模式,照上面的说明,设置工程包含我们上面得到的oSIP的相关开发库及SDK的一些开发库,并且由于默认LIBC的冲突,需要排除MSVCRT[D]开发库(其中D代表Debug模式下,没有D表示Release模式下),直接使用eXosip的几个主要函数就可以创建一个基本的SIP软电话模型。

其主要流程为:初始化eXosip库-启动事件监听线程-向SIPProxy注册-向某SIP终端(电话号码)发起呼叫-建立连接-结束连接初始化代码:int ret = 0;ret = eXosip_init ();eXosip_set_user_agent("##YouToo0.1");if(0 != ret){AfxMessageBox("Couldn't initialize eXosip!\n");return false;}ret = eXosip_listen_addr (IPPROTO_UDP, NULL, 0, AF_INET, 0);if(0 != ret){eXosip_quit ();AfxMessageBox("Couldn't initialize transport layer!\n");return false;}启动事件监听线程:AfxBeginThread(sip_uac,(void *)this);向SIPProxy注册:eXosip_clear_authentication_info();eXosip_add_authentication_info(uname, uname, upwd, "md5", NULL);real_send_register(30); /* 自定义函数代码请见源码 */发起呼叫(构建假的SDP描述,实际软电话使用它构建RTP媒体连接):osip_message_t *invite = NULL; /* 呼叫发起消息体 */int i = eXosip_call_build_initial_invite (&invite, dest_call, source_call, NULL, "## YouToo test demo!");if (i != 0){AfxMessageBox("Intial INVITE failed!\n");}char localip[128];eXosip_guess_localip (AF_INET, localip, 128);snprintf (tmp, 4096,"v=0\r\n""o=josua 0 0 IN IP4 %s\r\n""s=conversation\r\n""c=IN IP4 %s\r\n""t=0 0\r\n""m=audio %s RTP/AVP 0 8 101\r\n""a=rtpmap:0 PCMU/8000\r\n""a=rtpmap:8 PCMA/8000\r\n""a=rtpmap:101 telephone-event/8000\r\n""a=fmtp:101 0-11\r\n", localip, localip, "9900");osip_message_set_body (invite, tmp, strlen(tmp));osip_message_set_content_type (invite, "application/sdp");eXosip_lock ();i = eXosip_call_send_initial_invite (invite);eXosip_unlock ();挂断或取消通话:int ret;ret = eXosip_call_terminate(call_id, dialog_id);if(0 != ret){AfxMessageBox("hangup/terminate Failed!");}可以看到非常简单,再借助于oRTP和Mediastreamer开发库,来快速为我们的SIP软电话增加RTP和与系统语音API接口交互及语音编码功能,即可以快速开发出一个可用的SIP软电话,关于oRTP和Mediastreamer的相关介绍不是本文重点,将在有空的时候考虑增加相应使用教程第二阶段:---------------------------------------------------得到了一个SIP软电话模型后,我们可以根据软电话的实际运行表现(结合用Ethereal抓包分析)来进行代码的分析,以达到利用eXoSIP来辅助我们学习oSIP的最终目的(如要快速开发一个可用的SIP软电话,请至前面提到的论坛去下载使用oRTP和Mediastreamer快速搭建的一个基本完整可用的SIP软电话##YouToo 0.1版本的VC源码工程文件作参考)。

相关文档
最新文档