OSIP在NT平台下的测试

本文详细介绍oSIP协议栈开发库的编译与使用过程,并演示如何利用eXoSIp扩展库快速搭建SIP终端应用。文章包括配置开发环境、解决常见编译错误等实用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上面,我们得到了Osip的解析器开发库,下面再编译完整的Osip协

议栈开发库,同样照上述方法,分别创建动态链接库工程和静态链接库工程,只

是要拷的文件换成src下的osip目录下文件和include下的osip目录,得到

osip2.dll和osip2.lib。

  在编译osip2.dll这一步可能会再次得到错误,内容含义是找不到链接库,所

以,我们要把前面编译得到的osipparser2.lib也拷到osip工程目录下,并在VC

6中操作:
  Project-Setting-Link中的Object/Libr

ary Modules:
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自带的开发库太古董了,需要升

级系统的Platform SDK,下载地址如下:
  http://www.microsoft.com/msdownl ... PSP2FULLInstall.htm(VC6的

支持已经停止,这是VC6能使用的最新SDK)

  成功安装后编译前需加OSIP_MT宏,以启用线程库,否则在程序中使用eXoSIP

库时会出错,而编译时也会得到许多函数未定义的Warning提示,编译得到

exosip2.lib供我们使用,当然,在此之前需要成功编译了osip2和osipparser2,

而在之后的实际使用时,发现oSIP也需要增加OSIP_MT宏,否则OS

IP_MT调用oSIP的线程库时会出错,所以我们需要重新编译oSIP了

:),因为eXosip是基于oSIP的(同上方式创建静态和动态链接库工

程,并需在Link中手工添加oSIP和oSIPparser的lib库)。

-----------------------------------

-------------------
  创建新工程,可以是任意工程,我们从最简单的Win32控制台程序开始

,为了成功使用oSIP,我们需要引用相关库,调用相关头文件,经过多次试

验,发现需要引用如下的库:
exosip2.lib osip2.lib osipparser2.lib WSock32.Lib IPHlpApi.Lib

WS2_32.Lib Dnsapi.lib
  其中,除了我们上面编译得到的三个oSIP库外,其它库都是系统库,其中有

一些是新安装的Platform SDK所新提供的。

  至此,我们有了一个简单的开发环境了,可以充分利用网上大量的以oSI

P为基础的代码片段和官方说明文档开始具体函数功能的测试和使用了:)

-----------------------------------

-------------------
  我们先进行一个简单的纯SIP信令(不带语音连接建立)的UAC的SI

P终端的程序开发的试验(即一个只能作为主叫不能作为被叫的的SIP软电话

模型),我们创建一个MFC应用程序,对话框模式,照上面的说明,设置工程

包含我们上面得到的oSIP的相关开发库及SDK的一些开发库,并且由于默

认LIBC的冲突,需要排除MSVCRT[D]开发库(其中D代表Debug模式下,

没有D表示Release模式下),直接使用eXosip的几个主要函数就

可以创建一个基本的SIP软电话模型。
  
  其主要流程为:
  初始化eXosip库-启动事件监听线程-向SIP Proxy注册-

向某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);

  向SIP Proxy注册:
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!");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值